为服务编写集成测试

时间:2019-06-29 03:33:24

标签: java junit mockito powermock wiremock

我有一个要执行集成测试的服务类(白盒)。方法代码

   @Async( ELLA_THREAD_POOL_EXECUTOR_NAME )
    public void invokeEllaAsync( final IrisBo irisBo ) {

        if( isTrafficAllowed( irisBo ) ) {
            callEllaService( irisBo );
        }
    }

    public void callEllaService( final IrisBo irisBo ) {

        HttpHeaders ellaHeaders = createRequestHeaders( irisBo );

        ServiceResponse<EllaResponseDto> response = connector.call( EllaDtoConverter.convertToRequest( irisBo ), ellaHeaders );

        if( !response.isSuccess() ) {
            LOG.error( "ERROR", response, irisBo );
        }
    }

下面提供了测试方法,

@Test
public void testCallEllaServiceIsSuccessful() throws IOException {

    String emailAgeResponseJson = readFile( ELLA_RESPONSE_FILE );

    wireMockRule.stubFor( post( urlEqualTo( ELLA_ENDPOINT ) ).willReturn( okJson( emailAgeResponseJson ) ) );

    TestRequestInformation testRequestInformation = new TestRequestInformation();
    IrisBo irisBo = EllaTestDataProvider.createValidIrisBoWithoutRequest();


    service.callEllaService( irisBo );


}

我想验证响应数据,方法invokeEllaAsync返回void。响应位于方法callEllaService中。

如何验证响应数据?

1 个答案:

答案 0 :(得分:0)

首先,快速浏览一下this question。由于我并不是100%的人,实际上的确是在谈论Spring,所以我不建议您将其视为重复。

现在,假设我们正在谈论Spring的Async方法(集成测试可能使用SpringRunner运行),我将提供一些其他技术

概括地说,@Async方法是在不同的线程池上执行的。从技术上讲,这是通过生成运行时代理来完成的。 因此,有很多技术可以帮助您:

选项1

禁用测试的异步支持。这可以通过在自定义配置类上创建某种类型的条件来实现,以实现异步支持。像这样:

 @Configuration
 @EnableAsync
 @ConditionalOnProperty(name = "async.support.enabled", havingValue = true)
 public class MyAsyncEnablerConfiguration {

 }

对于测试,请设置变量false

选项2

如果它是控制器上的一种方法,并且您使用了模拟Mvc测试(再次,仅是我的推测,我不知道代码的真正位置),则可以利用asyncDispatch方法来处理异步请求。

它看起来像这样:

mockMvc.perform(asyncDispatch(mvcResult)) // <-- Note this call
                    .andExpect(status().isOk())
                ...

可以找到完整的示例Here

选项3

请注意,@Async方法的返回类型不必为void。它可以是Future,甚至可以是spring的AsyncResult。 因此,如果将来可以,您可以在代码中调用future.get()并获得结果。

要详细了解返回结果类型,请检查This tutorial