我需要在调用
Math.random()
的 Java 代码上编写一些 junit 测试。 我知道如果我实例化自己的随机对象以产生可重复的结果,我可以设置种子。有没有办法也为Math.random()
做到这一点?
方法
Math.random()
使用私有静态字段:
private static Random randomNumberGenerator;
如果您真的需要将其设置为
new Random(CONSTANT_SEED)
(例如您需要JUNit测试您无法控制的代码),您可以使用reflection来实现。
您自己创建一个
Random
的实例并使用它怎么样? Math.random()
创建一个并使用它,所以我认为你不能弄乱它的种子。但是,如果您创建 Random
并直接使用它,则可以在创建它时为其设置种子,和/或稍后可以对其调用 setSeed()
。
使用您的种子使用 Random 实例设置它,或者只是扩展方法以返回您需要的值
Field field = Math.class.getDeclaredField("randomNumberGenerator");
field.setAccessible(true);
field.set(null, new Random() {
@Override
public double nextDouble() {
return 1;
}
});
您可以编写自己的 Random() 和 Seed() 函数...