본문 바로가기

개발일지/TIL

[ 230617 ] Java Spring WireMock 이슈 및 적용

사용 이유

일반적으로 단위 테스트를 짤 때는 mock을 만들어해야 하는 외부와 통신이 들어가는 부분을 제외한다고 책에서 읽어었다. 하지만 이번에 사이드 프로젝트 하면서 친구와 논의를 해 mock을 적용을 해보기로 했다. 이제까지 테스트 코드를 많이 적용해 보지 못했기에 연습도 겸하는 것도 있었다.

의존성 문제

공식 사이트에서 제공하는 방식으로 build.gradle에 의존성을 추가함으로 설치를 했다. 설치 후 JUnit5를 기반한 어노테이션을 사용해 코드를 작성했다. 하지만 테스트를 실행 했을 때 에러가 뜨며 정상적으로 동작하지 않았다. 라이브러리가 정상적 설치가 되었지만 WireMock 관련 클래스를 찾지 못했기 때문이다.

 

[ 추가한 의존성 ]
testImplementation "com.github.tomakehurst:wiremock-jre8:2.35.0"

[ 발생한 에러 ]
java.lang.NoClassDefFoundError: javax/servlet/DispatcherType

문제 해결

처음에는 라이브러리가 정상 설치 되었는지 확인했다. 두 번째는 공식 문서를 다시 찾아보며 코드를 정상 적용되었는지 확인을 했다. 하지만 라이브러리 정상 설치와 JUnit5와 함께 사용하는 방식의 가이드라인을 따라 작성된 나의 코드를 확인했다. 마지막으로 에러 문구를 사용해 구글 검색을 사용했다. 검색을 통해 JavaSpring Boot 3 버전을 사용할 경우 현재 WireMock 라이브러리에서 이와 같은 문제가 발생한다. 또한 문제를 해결하기 위해 WireMock 2 Standalone 버전을 설치를 하거나 Beta 버전인 3 버전을 사용해야 한다. 안정성을 위해 WireMock 2 Standalone 버전을 사용해 해결을 하기로 했다.

 

[ 의존성 변경 ]
testImplementation "com.github.tomakehurst:wiremock-jre8-standalone:2.35.0"

WireMock을 이용한 테스트 코드 작성

WireMockTest 어노테이션을 사용해 테스트 환경을 설정 했다. 필요한 요청 및 응답은 stubFor 메서드를 통해 구현을 했다.

 

@SpringBootTest
@WireMockTest(httpsEnabled = true, httpPort = 8080)
class AuthServiceTest {

    @Autowired
    private AuthService authService;

    @Test
    @Description("카카오 유저 조회 성공")
    public void kakaoLoginSuccessTest() throws IOException {
        stubFor(get("/kakao-login")
                .willReturn(ok()
                        .withHeader("Content-Type", "application/json")
                        .withBody("{ \"email\": \"ironparyer\" }")
                ));

        User user = authService.login("kakao", "token");
        Assertions.assertNotNull(user);
    }
}

결론

실제 테스트는 정상적으로 진행이 되었다. 테스트 코드를 작성해 본 경험이 미미하기에 제대로 된 테스트일까 의문이 조금 들긴 했다. 테스트를 적용해야 하는 영역, 단위 테스트에만 사용되어야 하는 영역, 통합 테스트에만 사용되어야 하는 영역 등을 판단하는 능력도 부족하다는 것을 느꼈다. 그래서 이번 기회에 과하게 테스트 코드를 적용해보려고 한다. 거기에 더해 다른 사람들의 테스트 코드도 많이 보려고 한다. 이를 통해 경험치를 쌓아 적절한 테스트 코드를 짤 수 있는 능력을 키울 것이다.

참고

 

WireMock User Documentation

All of WireMock’s features are accessible via its REST (JSON) interface and its Java API. Additionally, stubs can be configured via JSON files. Read the full doc here.

wiremock.org

 

wiremock issue when upgrading to Spring Boot 3

When upgrading my Spring Boot 2.5 to 3.0 , I am facing some issues with Wiremock, probably due to the move to jakarta namespace. Even upgrading to latest wiremock-jre8 , ie 2.35.0 (as of december 2...

stackoverflow.com