고민
- cache만료를 확인하기 위해 일정시간을 지연하여 값을 확인하고자 하였다.
- 처음에는 Thread.sleep을 통해 간단하게 해보려고 했지만 의미상 연결을 주석으로 써야만하는 아쉬움이 남았다.
결론
- 결론적으로 awaitility라이브러리를 사용하였다. 지연테스트를 성공적으로 확인했다.
- 이번 기회에는 단순히 지연테스트만 해보았는데 다음기회에 비동기 테스트도 구현해보면 재밌겠다. 예전에 CountLatchDown으로 비동기테스트를 구현했었는데 그거랑 비교해보면 어떨지 기대된다.
접근방법
- 앞단에 3초 후에 만료되는 redis key인(어느 cache든 상관없음) testKey를 세팅해두었다.
(- 참고로 spring-data-redis를 이용하여 redisTemplate을 사용하였다.) - 그 다음에 바로 아래 로직을 실행해서 확인하였다. 의미는 다음과같다.
- 기본(10초동안) 아래의 로직을 확인하는데
- 이 시간 역시 메소드로 수정가능하다.
private static volatile WaitConstraint defaultWaitConstraint = AtMostWaitConstraint.TEN_SECONDS;
- 이 시간 역시 메소드로 수정가능하다.
- 3초후에 실행되며 (pollDelay 부분)
- 기본적으로 대기시간은 없다.
private static final Duration DEFAULT_POLL_DELAY = null;
- 기본적으로 대기시간은 없다.
- 1초마다 확인해보는데 (pollInterval 부분)
- 기본은 0.1초
private static final PollInterval DEFAULT_POLL_INTERVAL = new FixedPollInterval(ONE_HUNDRED_MILLISECONDS);
- 기본은 0.1초
- 그 동안에 toBeExpiredData가 null이 된다면 성공이다.
- toBeExpiredData는 3초 캐쉬만 되는 key이기에 3초이후부터는 assertThat(toBeExpiredData).isNull(); 문장이 true가 되고 그러면 전체 실행시간 10초가 되지 않아도 성공으로 종료된다.
- 기본(10초동안) 아래의 로직을 확인하는데
await()
.pollDelay(Duration.ofSeconds(3)) //3초대기
.pollInterval(Duration.ofSeconds(1)) //1초마다 확인
.untilAsserted(() -> {
Object toBeExpiredData = redisTemplate.opsForValue().get("testKey");
assertThat(toBeExpiredData).isNull();
});
소개
- awaitility는 비동기 테스트에 효과적인 라이브러리로 소개되고 있다.
- http://www.awaitility.org 소개도 아래처럼 되어있다.
Testing asynchronous systems is hard. Not only does it require handling threads, timeouts and concurrency issues, but the intent of the test code can be obscured by all these details. Awaitility is a DSL that allows you to express expectations of an asynchronous system in a concise and easy to read manner.
- 간단히 얘기하면 비동기 테스트 어려운데 이거쓰면 쉬워~
- http://www.awaitility.org 소개도 아래처럼 되어있다.
참고
http://www.awaitility.org/
http://antkorwin.com/async/async_test_spring.html
https://github.com/awaitility/awaitility/wiki/Usage#usage-examples
https://github.com/spring-projects/spring-framework/pull/1941/files/1a08345c0cbbefc331a4c96fbdb63bc52b90203c
https://junojunho.github.io/how-to-test-whenComplete-in-java/
'일반적인 로직적용' 카테고리의 다른 글
.use(moment()에서 java LocalDateTime으로 변환하기) (0) | 2021.01.25 |
---|---|
.use(@Nullable의 재발견) (0) | 2020.12.21 |
.use(@DataRedisTest) (0) | 2020.12.20 |
.use(jpa 조건절에서 and 속에서 or사용하기) (0) | 2020.12.20 |
.use(@MockBean vs @Mock) (0) | 2020.12.17 |