我有一个要执行集成测试的服务类(白盒)。方法代码
@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
中。
如何验证响应数据?
答案 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