@WebFluxTest 테스트 오류, Bean 을 찾지 못하는 오류

이현지·2022년 6월 17일
1

이슈 사항

현재 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을 등록하지 않은 모든 서비스 파일에 대해 이 에러를 뱉고 있다는 생각이..! 그렇다면 대체 왜..? 어디선가 서로 얽혀있는 것인가...?
그러다 디버깅 메시지를 읽어보던 중 눈에 띄는 메시지가 있었다.

  • Did not detect default resource location for test class ....

응? 위치를 탐지하지 못한다고...? 황급히 구글링을 해보았다.

해결방법

해당 문제는 @SpringBootApplication 에 선언한 클래스명과 테스트 클래스명이 일치하지 않아서 발생하는 문제였다.
클래스 이름은 UserKeyController 인데 테스트 클래스명은 UserKeyContorllerTest 이기 때문에 위와 같은 메시지가 나타났다.
이는 @ContextConfiguration 을 통해 클래스명을 지정해주면 해결할 수 있다.

@ContextConfiguration(classes = UserKeyController.class)
@WebfluxTest
public class UserKeyControllerTest {

다음과 같이 선언해주니 정상 동작하는 것을 확인할 수 있었다.
아무래도 이름이 달라서 처음부터 @Controller 등 스캔 대상 범위의 모든 파일을 스캔하는 것이 아닌가 싶다.. 그래서 모든 컨트롤러에 해당하는 의존성 관계를 찾을 수 없다는 에러가 나타난 것 같다.

profile
Backend Developer👩‍💻

1개의 댓글

comment-user-thumbnail
2024년 7월 19일

깔끔한 정리 감사합니다.

답글 달기