Async Method 테스트

28 February 2018

Spring에서 junit 테스트를 작성할 때, async method를 테스트하는 경우에 어려움을 가지게 됩니다.
이 장에서는 test 실행 시, async task executor를 sync task executor로 변환해서 테스트하는 방법을 소개합니다.


@Service
@Slf4j
public class TestServiceImpl implements TestService {

    @Autowired
    private RestTemplate restTemplate;

    @Override
    @Async
    public void getString() {

        log.info("start");
        restTemplate.getForEntity("http://www.test.com", String.class);
    }
}
위와 같이 선언된 async method를 테스트해보도록 합니다.


@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class TestServiceTest {

    @Configuration
    @Import(AsyncTestApplication.class)
    static class ContextConfiguration {
        @Bean
        @Primary
        public Executor executor() {
            return new SyncTaskExecutor();
        }
    }

    @Autowired
    private TestService testService;

    @MockBean
    private RestTemplate restTemplate;

    @Test
    public void testGetString() {

        //given
        given(restTemplate.getForEntity(anyString(), eq(String.class))).willReturn(new ResponseEntity(HttpStatus.OK));

        //when
        testService.getString();

        //then
        verify(restTemplate, times(1)).getForEntity(anyString(), eq(String.class));
    }
}

위와 같은 configuration 설정을 통해, junit test config 설정을 할 수 있습니다.
해당 test 진행시, 전체 configuration을 설정하며 Executor를 syncTaskExecutor로 교체하게 됩니다.


2018-03-01 15:54:47.729  INFO 6836 --- [           main] o.b.test.service.impl.TestServiceImpl    : start
테스트를 실행시, 위와 같이 테스트가 성공하는 것을 확인할 수 있습니다.

전체 예제는 아래 링크에서 다운로드 받을 수 있습니다.

https://gitlab.com/shashaka/async-junit-test-project