我有一个服务,用于模拟 IoT 硬件组件,该组件定期向 SOAP 端点发送数据:
private static final int DEFAULT_CHUNK_SIZE_IN_BYTES = 100 * 1024;
public void simulate(final int samplingFrequencyMs, final int uploadFrequencyMs) {
// ...
此方法每次 samplingFrequencyMs
都会生成一个 JSON 对象随着时间的流逝,每次都会调用 SOAP 端点 uploadFrequencyMs
随着时间的推移,生成的数据被分成 DEFAULT_CHUNK_SIZE_IN_BYTES
大小块。
例如,如果 samplingFrequencyMs
是 500
和uploadFrequencyMs
是 1000
那么此方法将每秒向 SOAP 端点发送 2 个生成的 JSON 字符串,如果 2 个 JSON 字符串的大小为 200 Kbyte,则它将发送 2 个 block 。
还有一种停止模拟的方法:
public void stopSimulation() {
// ...
我已经为此模拟器编写了测试:
@Test
public void shouldSendProperAmountOfChunksWhenInvokingSimulate() throws InterruptedException
{
// ...
// when
underTest.simulate(100, 500);
Thread.sleep(750);
underTest.stopSimulation();
Thread.sleep(500);
// then
verify(requestServiceMock, times(EXPECTED_REQUEST_CALL_TIMES)).doRequest(uploadBinary, header);
}
但是此测试在 100 次中失败 1-2 次,因为未调用服务 EXPECTED_REQUEST_CALL_TIMES
次,所以不稳定。当我必须验证调用方法的次数但涉及计时时,如何测试这一点?我用过750
因为它在500
之间和1000
我认为这应该可以解决问题,但我认为对于这种情况必须有一些测试最佳实践。
最佳答案
您需要做的就是从 CUT 中抽象出系统时间的概念。典型的方法是注入(inject)一个您可以控制的Clock
对象。您的实际实现将委托(delegate)给系统时钟,但在测试中您可以精确控制正在发生的事情。
关于java - 如何正确测试这种定时并发处理服务呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30667124/