How to write unit test to test asynchronous behavior using Spring 4 and annotations?

How to write unit test to test asynchronous behavior using Spring 4 and annotations?

Since I'm used to the Spring (old) style of xml), it took me a while to figure this out. So I decided to answer my question to help others.

+6
source share
1 answer

First, a service that provides the async boot method:

@Service public class DownloadService { // note: placing this async method in its own dedicated bean was necessary // to circumvent inner bean calls @Async public Future<String> startDownloading(final URL url) throws IOException { return new AsyncResult<String>(getContentAsString(url)); } private String getContentAsString(URL url) throws IOException { try { Thread.sleep(1000); // To demonstrate the effect of async InputStream input = url.openStream(); return IOUtils.toString(input, StandardCharsets.UTF_8); } catch (InterruptedException e) { throw new IllegalStateException(e); } } } 

Further test:

 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration public class DownloadServiceTest { @Configuration @EnableAsync static class Config { @Bean public DownloadService downloadService() { return new DownloadService(); } } @Autowired private DownloadService service; @Test public void testIndex() throws Exception { final URL url = new URL("http://spring.io/blog/2013/01/16/next-stop-spring-framework-4-0"); Future<String> content = service.startDownloading(url); assertThat(false, equalTo(content.isDone())); final String str = content.get(); assertThat(true, equalTo(content.isDone())); assertThat(str, JUnitMatchers.containsString("<html")); } } 
+6
source

All Articles