是否有一种方法可以在不使用powermock的情况下,在Mockito中模拟UUID?

3

我想模拟一个具有uuid值的对象,但我不想安装powermock。


请与我们分享导致问题的代码。总的来说,模拟UUID似乎是错误的方法。那个类只是一个数据容器。你不需要模拟它们,只需创建包含要使用的数据的实例即可。例如:你不需要模拟列表;只需创建一个普通列表并放入你想要的数据即可。 - GhostCat
1个回答

1
您实现此目标的最简单方法是封装您的UUID生成。假设您有一个使用UUID.randomUUID的类。
public Clazz MyClazz{

public void doSomething(){
    UUID uuid = UUID.randomUUID();
}

}

UUID生成完全与JDK实现有关。解决方案是包装UUID生成,可以在测试时用不同的依赖替换。
Spring针对这种情况提供了一个接口https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/util/IdGenerator.html
我并不建议您使用Spring进行此接口,仅供信息参考。
然后,您可以封装UUID生成。
public class MyClazz{

private final idGeneartor;

public MyClazz(IdGeneartor idGenerator){
    this.idGenerator = idGenerator;
}

public void doSomething(){
    UUID uuid =idGenerator.generateId();
}

根据您的需求,您可以有多个UUID生成的实现。

public JDKIdGeneartor implements IdGenerator(){

    public UUID generateId(){
       return UUID.randomUUID();
    }
}

还有一种硬编码的实现方式,将始终返回相同的UUID。

public HardCodedIdGenerator implements IdGenerator(){

    public UUID generateId(){
       return UUID.nameUUIDFromBytes("hardcoded".getBytes());
    }
}

在测试时,您可以使用HardCodedIdGenerator构造对象,这样您就可以知道生成的ID是什么,并更自由地进行断言。

如果我在一个类中创建生成器,然后可以模拟该类(例如val mockUtilities = mock(classOf[utilities]) when (mockUtilities.generateId).thenReturn(1)),我想这应该可以工作。如果我的方法在一个“object”中,我该怎么做呢?您能否请看一下https://stackoverflow.com/questions/55016630/can-i-and-how-mock-methods-of-an-global-onbject - Manu Chadha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接