繁体   English   中英

如何模拟 java.util.Random 类的依赖项?

[英]How can I mock a dependency of java.util.Random class?

假设在一个类中,我依赖于 java.util.Random 类。 由于 random 是一个具体的类并且没有接口支持,我如何模拟依赖? 我应该扩展随机类并覆盖方法。

我最初使用的是 Math.random() 但由于它是一个静态方法,我该怎么做才能模拟它? 如何模拟单元测试的静态方法。

不要直接使用java.util.Random class ,而是创建并调用您注入到类中的MyRandomUtility类。

在这个类中,你只需要有一个包装java.util.Random class

class MyRandomUtility {

  public Int getRandom(){
      java.util.Random.nextInt().....
  }
}

在您的main类中,您可以包含MyRandomUtility

在测试中,您现在可以轻松模拟它。

您可以使用 PowerMockito。 它是 mockito 的扩展,它让你模拟静态方法。

https://www.baeldung.com/intro-to-powermock

public class CollaboratorWithStaticMethods {
    public static String firstMethod(String name) {
        return "Hello " + name + " !";
    }
 
    public static String secondMethod() {
        return "Hello no one!";
    }
 
    public static String thirdMethod() {
        return "Hello no one again!";
    }
}

@Test
public void TestOne() {
    mockStatic(CollaboratorWithStaticMethods.class);

    when(CollaboratorWithStaticMethods.firstMethod(Mockito.anyString()))
    .thenReturn("Hello Baeldung!");
}



示例来自链接。

嘲笑这样一个类的一个原因是测试,而不是嘲笑你让它每次都返回相同的“随机”值,这样你就可以在测试中断言可预测的结果。 您可以通过传递带有seed的 Random 实例来实现这一点。

Random rand = new Random(1L);
System.out.println(rand.nextInt());

现在nextInt每次运行时都会返回相同的数字

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM