개발 공부/Spring

테스트에서만 @Async 적용되지 않도록 하기

gmelon 2023. 12. 27. 23:39

⭐️ 방법 매우 간단함 주의..

문제 상황

알림 발송 로직을 비동기로 처리하고 테스트를 수행하려니 아래와 같이 알림 발송을 검증하는 테스트가 깨지는 문제가 생겼다.

원인은 비동기 메서드인 notificationService.send()가 완료되기 이전에 값이 생성되었는지를 검증하려고 했기 때문이다.

더 큰 문제로, 비단 알림 발송 자체를 검증하는 테스트 뿐만 아니라 다른 테스트에서도 해당 테스트가 수행하는 로직이 특정 작업을 마치고 알림 발송을 수행하는 경우 동일하게 비동기 로직이 수행되어 테스트가 깨지고 있었다.

그 예시로, 위의 경우 테스트 완료 후 수행하는 reset.sql 에서 알림 테이블을 지울 때 존재하지 않던 알림이 (비동기로 실행되어) 회원 테이블을 지울 때 존재하게 되는 상황이다. 때문에 외래키 무결성 위반으로 오류가 발생했다.

reset.sql

해결 방법

처음에는 비동기를 유지하면서 이를 테스트에서 기다리도록 코드를 작성해보려 했지만 너무 복잡해지고 어려워서 우선 멈추고 다른 방법을 고민했다. 아무리 검색해봐도 마땅한 방법이 안 나오던 와중 문득 프로필을 이용하면 되는구나..! 하고 생각이 들었다. 너무나 간단하고 당연한 방법인데.. 떠올리지 못하고 있었다 🥲

 

@Async를 사용하려면 @EnableAsync 어노테이션을 설정 파일에 달아주어야 한다. 기존에는 아래와 같이 WebConfig에 같이 달아주고 있었는데,

이를 AsyncConfig로 분리해주고 test가 아닌 프로필에서만 빈으로 등록되도록 해주었다.

기존에도 테스트는 아래와 같이 test 프로필로 실행되고 있었으므로 이렇게 해주는 것만으로 문제를 해결할 수 있었다.

이제 알림 발송 메서드가 동기로 실행되어 테스트가 성공하는 것을 확인할 수 있다.