2010-05-14 94 views
8

我需要在调用Math.random()的Java代码上编写一些junit测试。我知道如果我正在实例化我自己的Random对象以产生可重复的结果,我可以设置种子。有没有办法做到这一点也为Math.random()在Math.random()上设置种子

回答

12

的方法Math.random()使用专用静态字段:

private static Random randomNumberGenerator; 

如果你真的需要将其设置为一个new Random(CONSTANT_SEED)(比如你需要,你无法控制的JUnit测试代码)你可以通过使用反射来实现。

+5

那你能不能对你的解答的反射部分详细说明,请价值观? – 2012-05-21 04:51:17

9

如何自己创建Random的实例并使用它? Math.random()创建一个并使用它,所以我不认为你可以混淆它的种子。但是,如果您创建一个Random并直接使用它,则可以在创建它时为其设置种子,并且/或者稍后可以在其上调用setSeed()

2

与随机的情况下与你的种子或设置它只是扩展方法,返回你需要

 Field field = Math.class.getDeclaredField("randomNumberGenerator"); 
     field.setAccessible(true); 
     field.set(null, new Random() { 

      @Override 
      public double nextDouble() { 
       return 1; 
      } 

     }); 
+0

随机的规范版应该返回4! – 2014-12-08 15:11:50