java - 如何正确测试这种定时并发处理服务呢?

标签 java junit testng mockito timing

我有一个服务,用于模拟 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大小块。

例如,如果 samplingFrequencyMs500uploadFrequencyMs1000那么此方法将每秒向 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/

相关文章:

java - 线程 "main"java.lang.NoClassDefFoundError : org/mockito/Mockito 中的异常

java - 在 Eclipse 中右键单击项目或文件时,查找错误不显示

java - TestNG.XML 未执行。通过 maven -mvn test 运行时 - 即使在 POM.XML 中进行了正确配置后

java - TestNG 方法中的可变长度参数

java - Lucene 搜索两个或多个单词在 Android 上不起作用

java - JScrollPane 似乎在从右到左的方向上工作不正确,但我不太确定如何

java - shell脚本if语句从java执行?

java - JUnit 'AssertionError' 出现预期异常,即使抛出异常

java - 如何模拟在构造函数中创建的类?

groovy - 无法在 groovy 方法上添加多个注释?