Mockito和Deffered结果

时间:2017-11-24 10:53:42

标签: java powermock spring-test powermockito

我有一个基于弹簧的项目,我正在努力改善其中的代码覆盖率

我有以下代码块在defferedResult onCompletion方法上使用lambda

        util.getResponse(userInfoDeferredResult, url, userName, password);

    userInfoDeferredResult.onCompletion(() -> {
        //the result can be a String or ErrorResponse
        //if ErrorResponse we don't want to cause ClassCastException and we don't need to cache the result
        if (userInfoDeferredResult.getResult() instanceof String){

            String response = (String) userInfoDeferredResult.getResult();

            cacheServices.addValueToCache(Service.USER_INFO_CACHE_NAME, corpId, response);              
        }
    });

我在想 - 是否可以使用mockito或powerMockito来模拟onCompletion lambda的内容?

4 个答案:

答案 0 :(得分:6)

将内容提取到新方法:

if(userInfoDeferredResult.getResult() instanceof String) {
     String response = (String) userInfoDeferredResult.getResult();
     cacheServices.addValueToCache(Service.USER_INFO_CACHE_NAME, corpId, response);              
 }

然后用那种方法测试方法?

答案 1 :(得分:4)

您的测试应该模拟cacheServices,并执行lambda。

答案 2 :(得分:2)

在这种情况下,将内容提取到新方法是很好的解决方案,如其他答案所述。

另外,您可以在以下链接中找到文章: http://radar.oreilly.com/2014/12/unit-testing-java-8-lambda-expressions-and-streams.html

答案 3 :(得分:0)

通常,我不希望更改测试代码的服务代码(例如,提取到method并将其公开,尽管它应该是私有的)。调用onCompletion的{​​{1}}时将触发completed方法。因此,您可以通过以下方式进行测试:

AsyncContext

工作github example here

@SpringBootTest相比,@RunWith(SpringRunner.class) @WebMvcTest(DeferredResultController.class) public class DeferredResultControllerUnitTest { @MockBean CacheServices cacheServices; @Autowired private MockMvc mockMvc; @Test public void onCompletionTest() throws Exception { mockMvc.perform(get("/your_url")) .andDo(mvcResult -> mvcResult.getRequest().getAsyncContext().complete()); Mockito.verify(cacheServices) .addValueToCache(Service.USER_INFO_CACHE_NAME, getExpextedCorpId(), getExpectedResponse()); } } 不会启动所有Spring应用程序上下文,因此它更轻巧。