2015-06-05 24 views
1

我有用于模拟周期性将数据发送到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大小块。

因此,例如,如果是samplingFrequencyMs500uploadFrequencyMs1000则此方法将发送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,因为它介于5001000之间,我认为这应该可以做到这一点,但我认为在这种情况下必须有一些测试最佳实践。

+0

我假设有生产者和消费者线程在模拟方法中运行。如果消费者休息1秒钟,然后收集所有消息并发送到soap端点,同时生产者在0.5秒内依次插入队列中的数据:我们可以预期消费者只发送1个消息的条件。调用Thread.sleep(500)可以保证最少500 ms的睡眠时间。它最终可能会等待超过500毫秒。 – hsnkhrmn

+0

有一个“计时器”,它每500毫秒就为一个“执行器”安排一个生产者和一个消费者任务。 –

回答

1

你需要做的是从CUT中抽象出系统时间的概念。一种典型的方法是注入一个可以控制的对象。您的真实实施将委托给系统时钟,但在测试中,您可以精确控制发生的情况。