오늘 할일

  • 테코톡
    • 공지
    • 진행
  • 장바구니 2단계 제출
    • extractor 사용
    • 추가된 service, repository, dao 테스트 추가
    • JdbcTestUtils 적용

테스트 이슈

이번 미션에서 인증과 관련된 중복 코드를 제거하기 위해 ArgumentResolver와 Interceptor를 적용했다. 커스텀 ArgumentResolver 클래스와 Interceptor 클래스를 구현해서 WebMvcConfigurer에서 등록해주어야 한다.
따라서 다음과 같이 ArgumentResolver와 Interceptor를 필드로 가지고 생성자를 주입받도록 했다.

@Configuration  
public class WebMvcConfiguration implements WebMvcConfigurer {  

    private final AuthenticationPrincipalArgumentResolver authenticationPrincipalArgumentResolver;  
    private final BasicAuthInterceptor basicAuthInterceptor;  

    public WebMvcConfiguration(  
    AuthenticationPrincipalArgumentResolver authenticationPrincipalArgumentResolver,  
    BasicAuthInterceptor basicAuthInterceptor  
    ) {  
    this.authenticationPrincipalArgumentResolver = authenticationPrincipalArgumentResolver;  
    this.basicAuthInterceptor = basicAuthInterceptor;

    ...
}

따라서 이 ArgumentResolver와 Interceptor를 사용하는 컨트롤러에서는 이들을 스텁하여 인증을 패스하고, 원하는 사용자 객체를 리턴하도록 구성하고 테스트를 진행할 수 있었다.

@ExtendWith(SpringExtension.class)  
@WebMvcTest(CartItemsController.class)  
class CartItemsControllerTest {  

    @MockBean  
    AuthenticationPrincipalArgumentResolver authenticationPrincipalArgumentResolver;  
    @MockBean  
    BasicAuthInterceptor basicAuthInterceptor;
    ...

    @BeforeEach  
    void setUp() throws Exception {  
        loginDto = new LoginDto(1L, "1", "2");  

        when(basicAuthInterceptor.preHandle(any(), any(), any()))  
        .thenReturn(true);  
        when(authenticationPrincipalArgumentResolver.supportsParameter(any()))  
        .thenReturn(true);  
        when(authenticationPrincipalArgumentResolver.resolveArgument(any(), any(), any(), any()))  
        .thenReturn(loginDto); 
    }

    ...
}

하지만 이들을 사용하지 않는 컨트롤러를 테스트할 때도 @WebMvcTest를 사용한다면 WebConfigurer를 빈으로 등록하고, 이 빈이 의존하는 커스텀 ArgumentResolver와 Interceptor가 빈으로 등록하려고 하게 된다. 이 빈들을 모두 @MockBean으로 등록해줄수는 있지만 이 빈들이 많아지면 이 빈들이 필요없는 테스트에서 전부 @MockBean으로 등록해주어야 한다.
중복을 줄이기 위해서 @TestConfiguration 에서 Test에서만 사용될 빈을 등록하도록 할 수 있지만 보다 좋은 방법이 없는지 찾아봐야 할 것 같다...

'회고 > 우아한테크코스' 카테고리의 다른 글

[레벨 2] 웹 자동차 경주 미션 회고  (0) 2023.05.08
2023.05.06 일일 회고  (0) 2023.05.07
2023.05.03 일일 회고  (0) 2023.05.04
2023.05.02 일일 회고  (0) 2023.05.03
2023.04.25 일일 회고  (0) 2023.04.26

+ Recent posts