아 더 작게 테스트 하고싶다.
기존 체스 미션의 컨트롤러 테스트는 @SpringBootTest 어노테이션을 통해 테스트를 진행했습니다. 해당 어노테이션은 실제 애플리케이션과 관련된 빈을 모두 주입하고 jdbc까지 관련하여 세팅 작업을 해야 했습니다.

컨트롤러와 관련된 빈만 주입하여 좀 더 작은 단위로 테스트를 진행할 수 있지 않을까? 이건 되는 걸로 아는데? 의 시작으로 어떻게 문제를 해결했는지 과정을 가볍게 적어보고자 합니다. 세부적인 내용은 포스팅을 따로 해보겠습니다.
@WebMvcTest
@WebMvcTest는 컨트롤러가 예상대로 작동하는지 테스트하기 위한 테스트 어노테이션이다.
@Controller, @ControllerAdvice, @JsonComponent, Filter, WebMvcConfigurer and HandlerMethodArgumentResolver의 빈들이 스캔되고 @Component를 사용한 빈들은 스캔되지 않습니다.
@Service 어노테이션 상위에 @Component 어노테이션이 있기 때문에 컨트롤러가 의존하는 서비스 레이어 클래스는 빈으로 주입되지 않습니다. 따라서 서비스를 mocking 해서 사용했습니다.
@WebMvcTest(ChessGameController.class)
public class ChessGameControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private ChessGameService chessGameService;
}
여기까지는 기존에 알고 있던 지식을 활용하여 도달할 수 있었지만 이다음이 문제였습니다.
제 코드는 handlebar 엔진을 사용하여 데이터를 뷰에 전달했었는데요. 다음과 같은 오류가 발생했습니다.

에러 메시지를 읽어보니 해당하는 뷰로 이동을 할 수 없고 그 이유가 ViewResolver가 세팅이 되어있지 않아 뷰로 이동이 되지 않는다는 오류가 발생했습니다.
ViewResolver를 빈으로 등록해서 주입시키면 해결되지 않을까?
handlbar의 viewresolver와 관련된 코드를 검색해보니 다음과 같은 코드가 필요했습니다.
HandlebarsViewResolver resolver = new HandlebarsViewResolver();
resolver.setPrefix("classpath:/templates");
resolver.setSuffix(".hbs");
return resolver;
이제 HandlebarsViewResolver 객체를 빈으로 등록하고 컨트롤러 테스트 시 해당 빈이 주입만 되면 문제를 해결할 수 있을 것 같았습니다.
@TestConfiguration
@WebMvcTest(ChessGameController.class)
@ContextConfiguration(classes = HandlebarConfig.class)
class ChessGameControllerTest {
@TestConfiguration
static class HandlebarConfig {
@Bean
public HandlebarsViewResolver handlebarsViewResolver() {
HandlebarsViewResolver resolver = new HandlebarsViewResolver();
resolver.setPrefix("classpath:/templates");
resolver.setSuffix(".hbs");
return resolver;
}
}
...
}
다음과 같이 @TestConfiguration을 사용하여 handlebarsViewResolver를 빈으로 주입하여 컨트롤러 슬라이스 테스트를 성공할 수 있었습니다.
공부해야 될 키워드
@Import와 @ContextConfiguration 차이
@Springb @MockMvc 차이
@Mock @MockBean @InjectMocks 차이
단위 테스트, 통합 테스트, 슬라이스 테스트에 대한 관점
Mocking을 이용한 테스트 코드 작성 관점
참고: https://docs.spring.io/spring-boot/docs/1.5.2.RELEASE/reference/html/boot-features-testing.html