【问题标题】:Java - Mockito - CompletableFutures - Unexpected Result of Tested MethodJava - Mockito - CompletableFutures - 测试方法的意外结果
【发布时间】:2021-10-28 11:04:33
【问题描述】:

我有一个非常奇怪的极端情况,即未来每运行数千次就无法按预期完成。我能够持续触发故障的唯一方法是重复运行测试直到它失败。

说测试:

public class TestFunctionality(){
    @Mock private MockIntegrationA mockIntegrationA;
    @InjectMocks private MyHandler unitUnderTest;

    @BeforeEach
    public void init(){
        MockitoAnnotations.openMocks(this);
    }

    @Test
    public void testManagerFailThenSucceed(){
        when(mockIntegrationA.callRestMethod(any())
            .thenThrow(new RuntimeException(""))
            .thenReturn(CompletableFuture.completedFuture(null));

        CompletableFuture<Void> result = unitUnderTest.invokeMethod();
        assertTrue(result.isCompletedExceptionally());
        result = unitUnderTest.callFunction();
        assertFalse(result.isCompletedExceptionally());
    }
}

上面测试中的第一个断言是当测试出错时触发的。是否存在未正确清洁的问题或导致第一个结果没有异常完成的边缘情况?

【问题讨论】:

  • 不看invokeMethod的代码很难说。
  • 射击,遗憾的是,如果不分享我不允许分享的内容,我无法以任何有意义的方式展示该代码。
  • 很明显的可能性是您正在调用runAsync,并且在您断言时还没有发生异常。
  • 嗯,我们确实有类似使用 supplyAsync 模拟的集成之一。但是,我如何才能从 unitUnderTest.invokeMethod 获得回报,而我们的 return 语句中涉及的期货没有完成,因为它们被链接在一起?

标签: java junit mockito junit5 completable-future


【解决方案1】:

我不能将评论作为答案,但@tgdavies 关于 runAsync 的评论是正确的。我将其更改为 completedFuture,现在我无法触发此行为。非常感谢您的帮助!花了几个小时试图解决它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 2019-10-30
    • 2017-07-22
    • 2015-03-24
    相关资源
    最近更新 更多