我有用于模拟周期性将数据发送到SOAP端点的的IoT硬件组件服务:如何正确测试这种定时并发处理服务?
private static final int DEFAULT_CHUNK_SIZE_IN_BYTES = 100 * 1024;
public void simulate(final int samplingFrequencyMs, final int uploadFrequencyMs) {
// ...
此方法生成JSON对象每samplingFrequencyMs
时间的经过时间和每次调用SOAP端点uploadFrequencyMs
时间过去并将生成的数据分块为DEFAULT_CHUNK_SIZE_IN_BYTES
大小块。
因此,例如,如果是samplingFrequencyMs
和500
是uploadFrequencyMs
1000
则此方法将发送2产生JSON串每秒到SOAP端点,并且如果2个JSON串的大小是200字节,然后它将发送2块。
也有其停止模拟的方法:
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);
}
但此测试失败1-2次满分100,因为该服务未被调用EXPECTED_REQUEST_CALL_TIMES
次所以它不稳定。当我必须验证一个方法被调用的时间,但是有时间参与时,我该如何测试这个?我使用750
,因为它介于500
和1000
之间,我认为这应该可以做到这一点,但我认为在这种情况下必须有一些测试最佳实践。
我假设有生产者和消费者线程在模拟方法中运行。如果消费者休息1秒钟,然后收集所有消息并发送到soap端点,同时生产者在0.5秒内依次插入队列中的数据:我们可以预期消费者只发送1个消息的条件。调用Thread.sleep(500)可以保证最少500 ms的睡眠时间。它最终可能会等待超过500毫秒。 – hsnkhrmn
有一个“计时器”,它每500毫秒就为一个“执行器”安排一个生产者和一个消费者任务。 –