PowerMock RandomUtils.nextLong()从我的测试中返回不同的值

时间:2015-12-11 03:50:12

标签: java junit 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提供电源,以便每次从我的测试中传递给我不同的值来测试我的实现。

我无法想到在遍历地图时每次为randomUtils返回不同的测试值的方法。

例如

Map<Long,Long> mapofLongValues contains <1,2>,<3,4>
output : objectAById contains <randomNumberPassedFromMyTest,ObjectA>, <RandomNumberPassedFromMyTest,ObjectA>

我希望这个问题有道理。

2 个答案:

答案 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());
        }
    }
}