如何使用Spring 4和注释编写单元测试来验证异步行为?

时间:2013-12-27 20:17:28

标签: spring unit-testing asynchronous

如何使用Spring 4和注释编写单元测试来验证异步行为?

由于我已经习惯了Spring的(旧的)xml风格),我花了一些时间才弄明白。所以我想我回答自己的问题来帮助别人。

1 个答案:

答案 0 :(得分:6)

首先公开异步下载方法的服务:

@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);
        }
    }
}

接下来的测试:

@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"));
    }
}