如何对包含CompletableFuture的方法进行单元测试?

时间:2017-02-08 13:54:33

标签: java unit-testing

我试过这个,但我不太明白我找到的例子。我有一个带有Spring AfterPropertiesSet()方法的类,它调用另外两个方法来分离异步调用。我不知道如何对它们进行单元测试。方法startProcessingThread()如下所示:

void startProcessingThread(executor) {
    CompletableFuture.runAsync(() -> {
        Path filePath = null;       
        do {
            filePath = retrieveFromFileQueue();
            submitFileForProcessing(filePath);            
        } while (keepRunning);
    }, executor)
    .handle((theVoid, exception) -> {           
        if (exception != null) {
            LOG.error("Error submitting file for processing: " + exception);            
        }
        return null;
    });
}

我不想在测试方法中重写CompletableFuture(我呢?)。所以我想我需要在需要它们的方法(startProcessingThread()retrieveFromFileQueue())中使用Mocks(来自Mockito)来调用submitFileForProcessing()。但是CompletableFuture本身呢?我该嘲笑吗?对不起,我真的很困惑......

1 个答案:

答案 0 :(得分:1)

您应该在测试中避免不确定的逻辑,因此我建议您避免睡眠。相反,您可以使用Mockito的“时间”而不是“验证”,然后等到执行操作为止:

final xyz[] result = new[]{null};
final CountDownLatch latch = new CountDownLatch(1);
when(submitFileForProcessing(...).thenAnswer((Answer<Lwm2mCommand>) invocationOnMock ->
{
    result[0] = invocationOnMock.getArgument(index); // if you need to check the values passed to your method call

    latch.countDown();
}

// Call your method
        assertTrue(latch.await(60L, TimeUnit.SECONDS));
// If needed check the parameters passed to the mocked method

另一个提示:我不会模拟实际的测试类,而是模拟使用的依赖项之一。