我正试图找到一种方法来实现powermock RandomUtils.nextLong()
final Map<Long,ObjectA> objectAById = Maps.newHashMap()
for(Entry<Long,Long> entry: mapOfLongValues.entrySet()){
.....
....
long generatedId = RandomUtils.nextLong()
ObjectA a = new Object();
a.color= red;
objectAByID.put(generatedId,a);
}
以上是我的实现。
我正在写一个Junit测试来测试它。
有没有一种方法可以让我对randomutils进行powermock,这样它每次从测试到测试我的实现都会给我传递不同的值。
当遍历地图时,我想不出每次为randomUtils的测试返回不同值的方法。
例如。
Map<Long,Long> mapofLongValues contains <1,2>,<3,4>
output : objectAById contains <randomNumberPassedFromMyTest,ObjectA>, <RandomNumberPassedFromMyTest,ObjectA>
我希望这个问题有道理。
RandomUtils
公开一个静态字段JVM_RANDOM
,它是一个Random
。
你应该能够呼叫
RandomUtils.JVM_RANDOM.setSeed(System.currentTimeMillis());
在测试中——有效地更改种子(从而更改随机序列),以便在每次迭代中更改。
不需要那样嘲笑。
在固定数字的情况下(测试总是相同的),您只需初始化种子,使其具有固定的长值,然后RandomUtils
在每次运行中返回相同的序列。
RandomUtils.JVM_RANDOM.setSeed(123456789L);
注意:我不能确定,因为我还没有看到完整的代码,但objectAByID.put(generatedId,a);
可能建议您将这些值用作某些对象的id。虽然一开始这似乎是合乎逻辑的,但不能保证生成的数字是不同的。请记住这一点,因为这可能不是你想要的,
现在,严格从power mock的角度来看,您可以对JVMRandom
进行mock,以便在每次调用中返回不同但易于识别的值,但这并不是真正随机的。
// delegate test running to PowerMock so it can work its black magic
@RunWith(PowerMockRunner.class)
/* prepare classes for instrumentation:
- JVMRandom for mocking because it's final
- RandomUtils for creating new JVMRandom instances */
@PrepareForTest({RandomUtils.class, JVMRandom.class})
public class RdspSimulatorSbbLocalInterfaceTest {
@Mock
private JVMRandom mockedRandom;
private long currentValue;
@Before
public void setUp() throws Exception {
// reset before each test
currentValue = 0;
// use an answer to calculate and return a known value on each invocation
when(mockedRandom.nextLong()).thenAnswer(invocation -> (currentValue++));
// whenever a new JVMRandom instance is created, make sure to return our mock
PowerMockito.whenNew(JVMRandom.class).withNoArguments().thenReturn(mockedRandom);
}
@Test
public void shouldMockJVMRandom() {
for (int i = 0; i < 10; i++) {
assertEquals(i, RandomUtils.nextLong());
}
}
}