I need to write some junit tests on Java code that calls Math.random()
. I know that I can set the seed if I was instantiating my own Random object to produce repeatable results. Is there a way to do this also for Math.random()
?
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
回答1:
The method Math.random()
uses a private static field:
private static Random randomNumberGenerator;
If you really really need to set this to a new Random(CONSTANT_SEED)
(for instance you need to JUNit test code which you have no control over) you could do so by using reflection.
回答2:
How about creating an instance of Random
yourself and using that instead? Math.random()
creates one and uses that, so I don't think that you can mess with its seed. If you create a Random
and use it directly, however, you can set the seed for that when you create it, and/or you can call setSeed()
on it later.
回答3:
Set it with instance of Random with your seed or just extend the methods to return values you need
Field field = Math.class.getDeclaredField("randomNumberGenerator");
field.setAccessible(true);
field.set(null, new Random() {
@Override
public double nextDouble() {
return 1;
}
});