현재 webflux 기반으로 개발을 진행중인데, webflux 기반에서 만든 api 를 테스트하기 위해 테스트 코드를 작성하던 중 만난 문제이다.
먼저 @WebfluxTest 를 사용하여 간단하게 controller 테스트를 진행했다.
@WebFluxTest
public class UserKeyControllerTest {
@Autowired
private WebTestClient webTestClient;
@MockBean
private UserKeyService userKeyservice;
@Test
public void getUserKeysTest() {
this.webTestClient.get().uri("/api/user")
.exchange()
.expectStatus().isOk();
}
}
우선 다음과 같이 간단히 작성하고, 테스트를 돌려보는데 실패가 났다.
에러를 보니 주입이 되지 않았다는 에러...
음? 하지만 나는 의존성이 있는 UserKeyService
를 @MockBean
을 통해 주입해줬는데..??
내가 잠시 놓치는 부분이 있나 싶어서 부랴부랴 UserKeyController 에 가서 다른 의존성이 있는지 확인해봤다.
하지만 UserKeyService 외에는 의존성이 없었다.
에러 내용을 보면 UserKeyController와 전혀 관계가 없는 다른 서비스 파일의 의존성이 주입되지 않았다는 메시지가 나타난다.
왜 갑자기 RoutePathService...?
대체 뭐지...? 뭔가 싶어서 에러 메시지에 나타나는 서비스를 @MockBean
으로 등록했다.
그리고 실행한 뒤 이번엔 또 다른 서비스에서 의존성이 주입되지 않았다는 메시지가 뜨는게 아닌가..!
보아하니 @MockBean을 등록하지 않은 모든 서비스 파일에 대해 이 에러를 뱉고 있다는 생각이..! 그렇다면 대체 왜..? 어디선가 서로 얽혀있는 것인가...?
그러다 디버깅 메시지를 읽어보던 중 눈에 띄는 메시지가 있었다.
응? 위치를 탐지하지 못한다고...? 황급히 구글링을 해보았다.
해당 문제는 @SpringBootApplication
에 선언한 클래스명과 테스트 클래스명이 일치하지 않아서 발생하는 문제였다.
클래스 이름은 UserKeyController
인데 테스트 클래스명은 UserKeyContorllerTest
이기 때문에 위와 같은 메시지가 나타났다.
이는 @ContextConfiguration
을 통해 클래스명을 지정해주면 해결할 수 있다.
@ContextConfiguration(classes = UserKeyController.class)
@WebfluxTest
public class UserKeyControllerTest {
다음과 같이 선언해주니 정상 동작하는 것을 확인할 수 있었다.
아무래도 이름이 달라서 처음부터 @Controller 등 스캔 대상 범위의 모든 파일을 스캔하는 것이 아닌가 싶다.. 그래서 모든 컨트롤러에 해당하는 의존성 관계를 찾을 수 없다는 에러가 나타난 것 같다.
깔끔한 정리 감사합니다.