如何对使用 Java UUID 的代码进行单元测试?

2022-09-04 08:14:25

我有一段代码,预计会用Java UUID()填充响应对象的一个属性。UUID.randomUUID()

如何从外部对此代码进行单元测试以检查此行为?我不知道在其中生成的UUID。

需要测试的示例代码:

// To test whether x attribute was set using an UUID
// instead of hardcode value in the response
class A {
  String x;
  String y;
}

// Method to test
public A doSomething() {
  // Does something
  A a = new A();
  a.setX( UUID.randomUUID());
  return a;
}

答案 1

Powermock和静态嘲笑是前进的方向。您将需要类似下面的内容:

    ...
    import static org.junit.Assert.assertEquals;
    import static org.powermock.api.mockito.PowerMockito.mockStatic;
    ...

    @PrepareForTest({ UUID.class })
    @RunWith(PowerMockRunner.class)
    public class ATest
    {
    ...
      //at some point in your test case you need to create a static mock
      mockStatic(UUID.class);
      when(UUID.randomUUID()).thenReturn("your-UUID");
    ...
    }

请注意,静态模拟可以在带有@Before注释的方法中实现,因此可以在所有需要UUID的测试用例中重复使用它,以避免代码重复。

初始化静态模拟后,可以在测试方法中的某个位置断言 UUID 的值,如下所示:

A a = doSomething();
assertEquals("your-UUID", a.getX());

答案 2

编辑:在单元测试方面获得了更多的经验后,我会选择ThinkBonobo的答案。创建一个接口,一个假实现和一个具体的实现,就像这样:

public interface UuidProvider {
    UUID uuid();

    class Fake implements UuidProvider {
        @Override
        public UUID uuid() {
            return UUID.fromString("0000-00-00-00-000000");
        }
    }
}

public class RandomUuidProvider implements UuidProvider {
    @Override
    public UUID uuid() {
        return UUID.randomUUID();
    }
}

注入到测试和生产代码中。UuidProvider.FakeRandomUuidProvider

或者在 Kotlin 中:

interface UuidProvider {
    fun uuid(): UUID

    class Fake : UuidProvider {
        override fun uuid() = UUID.fromString("0000-00-00-00-000000")
    }
}

class RandomUuidProvider : UuidProvider {
    override fun uuid() = UUID.randomUUID()
}

我的旧答案如下。


除了 ThinkBonobo 的响应之外,还有另一种方式来创建 getter 方法(可选地用 )进行注释,例如可以在您在测试中定义的子类中重写该方法。@VisibleForTestingString getUUID()