我有一个 Spring 服务:
@Service
@Transactional
public class SomeService {
@Async
public void asyncMethod(Foo foo) {
// processing takes significant time
}
}
我对此进行了集成测试SomeService
:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
@IntegrationTest
@Transactional
public class SomeServiceIntTest {
@Inject
private SomeService someService;
@Test
public void testAsyncMethod() {
Foo testData = prepareTestData();
someService.asyncMethod(testData);
verifyResults();
}
// verifyResult() with assertions, etc.
}
这是问题所在:
- 如
SomeService.asyncMethod(..)
用@Async
and注释的那样 - 由于
SpringJUnit4ClassRunner
遵守@Async
语义
该testAsyncMethod
线程会将调用分叉someService.asyncMethod(testData)
到自己的工作线程中,然后直接继续执行verifyResults()
,可能在前一个工作线程完成工作之前。
在验证结果之前如何等待someService.asyncMethod(testData)
' 完成?请注意,如何编写单元测试以使用 Spring 4 和注释验证异步行为的解决方案?不要在这里申请,因为someService.asyncMethod(testData)
return void
,而不是 a Future<?>
。