我有一個春季服務:的JUnit測試春天@Async無效服務方法
@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.
}
這裏的問題是:
- as
SomeService.asyncMethod(..)
用@Async
和 註釋
- 爲
SpringJUnit4ClassRunner
粘附在@Async
語義
的testAsyncMethod
線程將呼叫分叉someService.asyncMethod(testData)
到自己的工作線程,然後直接繼續執行verifyResults()
,以前的工作線程完成其工作可能之前。
在驗證結果之前,我如何等待someService.asyncMethod(testData)
完成?請注意,How do I write a unit test to verify async behavior using Spring 4 and annotations?的解決方案在此不適用,因爲someService.asyncMethod(testData)
返回void
,而不是Future<?>
。