嘲笑和脱落结果



我有一个基于春季的项目,我正在尝试改进其中的代码覆盖范围

我有以下代码块,该代码在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的内容?

提取新方法的内容:

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

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

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

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

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

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

@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示例。

@SpringBootTest相反,@WebMvcTest不会启动所有春季应用程序上下文,因此更轻。

相关内容

  • 没有找到相关文章

最新更新