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



我正试图找到一种方法来实现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());
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新