我正试图找到一种方法来驱动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提供电源,以便每次从我的测试中传递给我不同的值来测试我的实现。
我无法想到在遍历地图时每次为randomUtils返回不同的测试值的方法。
例如
Map<Long,Long> mapofLongValues contains <1,2>,<3,4>
output : objectAById contains <randomNumberPassedFromMyTest,ObjectA>, <RandomNumberPassedFromMyTest,ObjectA>
我希望这个问题有道理。
答案 0 :(得分:0)
RandomUtils
公开了一个JVM_RANDOM
的静态字段Random
。
您应该可以致电
RandomUtils.JVM_RANDOM.setSeed(System.currentTimeMillis());
在你的测试中 - 有效地改变种子(以及随机序列)以在每次迭代中改变。
不需要那样嘲笑。
如果是固定数字(测试始终相同),您只需初始化种子以使固定长值 - 然后RandomUtils
在每次运行中返回相同的序列。
RandomUtils.JVM_RANDOM.setSeed(123456789L);
答案 1 :(得分:0)
注意:我无法确定,因为我没有看到您的完整代码,但objectAByID.put(generatedId,a);
可能会建议您将值用作某些对象的ID。虽然这看起来似乎合乎逻辑,但无法保证生成的数字不同。请记住这一点,因为它可能不是您想要的,
现在,严格地从power-mock的角度来看,你可以模拟JVMRandom
在每次调用时返回不同但容易识别的值,但不会真正随机。
// 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());
}
}
}