Mam usług wiosny:JUnit-testuje metodę usługi void Wiosna @Async
@Service
@Transactional
public class SomeService {
@Async
public void asyncMethod(Foo foo) {
// processing takes significant time
}
}
I mam test integracji tego 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.
}
Oto problem:
- jako
SomeService.asyncMethod(..)
jest opatrzone przypisami@Async
i - jako
SpringJUnit4ClassRunner
przestrzega@Async
semantyki
wątek testAsyncMethod
będzie widelec połączenia someService.asyncMethod(testData)
do własnego wątku roboczego, a następnie bezpośrednio kontynuować wykonywanie verifyResults()
, ewentualnie przed poprzedni pracownik wątek zakończył swoją pracę.
Jak mogę czekać na ukończenie someService.asyncMethod(testData)
przed sprawdzeniem wyników? Zauważ, że rozwiązania do How do I write a unit test to verify async behavior using Spring 4 and annotations? nie mają tu zastosowania, ponieważ someService.asyncMethod(testData)
zwraca void
, a nie Future<?>
.