代码之家  ›  专栏  ›  技术社区  ›  Damien

Mockito和微分结果

  •  3
  • Damien  · 技术社区  · 7 年前

    我有一个基于spring的项目,我正在努力提高其中的代码覆盖率

    我有以下代码块,在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模拟未完成lambda的内容?

    4 回复  |  直到 7 年前
        1
  •  6
  •   Nigam Patro    7 年前

    将内容提取到新方法:

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

    然后用这种方式测试方法?

        2
  •  4
  •   tkruse    7 年前

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

        3
  •  2
  •   Furkan Yavuz Vishal Saraf    7 年前

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

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

        4
  •  1
  •   elirandav    5 年前

    一般来说,我不喜欢更改测试代码的服务代码(例如提取到方法并将其公开,尽管它应该是私有的)。这个 onCompletion 方法在 completed 属于 AsyncContext 被称为。因此,您可以通过以下方式进行测试:

    @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());
            }
        }
    

    工作 github example here .

    与…对比 @SpringBootTest , @WebMvcTest 不会启动全Spring应用程序上下文,因此它更轻。