JUnit-testando um método de serviço Spring @Async void
Eu tenho um serviço Spring:
@Service
@Transactional
public class SomeService {
@Async
public void asyncMethod(Foo foo) {
// processing takes significant time
}
}
E eu tenho um teste de integração para issoSomeService
:
@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.
}
Aqui está o problema:
ComoSomeService.asyncMethod(..)
é anotado com@Async
eEnquanto oSpringJUnit4ClassRunner
adere ao@Async
semânticaatestAsyncMethod
thread vai bifurcar a chamadasomeService.asyncMethod(testData)
em seu próprio encadeamento de trabalho e continue diretamente executandoverifyResults()
, possivelmente antes que o segmento de trabalho anterior tenha concluído seu trabalho.
Como posso esperarsomeService.asyncMethod(testData)
conclusão antes de verificar os resultados? Observe que as soluções paraComo escrevo um teste de unidade para verificar o comportamento assíncrono usando o Spring 4 e anotações? não se aplica aqui, poissomeService.asyncMethod(testData)
retornavoid
, não umFuture<?>
.