본문 바로가기
Issue/Server

[Spring] mockStatic의 scope 제한을 하지 않아 발생하는 문제

by chickenman 2024. 11. 30.

1. 문제 상황

Unit test를 위해 static 유틸 클래스를 mock화시켜서 놓았었다. 

 

그런데 빠른 문제 해결을 위해서 자세히 문서를 찾아보지 않고 코드를 작성하다보니, 클래스의 static 메서드로 MockStatic 객체를 선언해버렸다. (나름 코드 중복 제거를 위해,,)

 

물론 코드를 추가하고 IntelliJ에서 테스트를 한~두번 정도 돌려보아도 문제가 발생하지 않아 넘어갔었었다. (운좋게 MockStatic이 실행되기 전 static 클래스가 실행되었다..)

 

그런데 시간이 지나 ./gradlew test를 반복하다보니 랜덤하게 유틸 클래스에 대한 테스트가 실패하는 것을 발견하게 되었다.

 

2. 문제점

그렇게 문제의 원인을 찾아가던 중 단순 web search로는 도저히 문제가 해결되지 않아서 공식 문서를 읽어보기 시작했다.

 

그러던 중 아래와 같이 mockStatic 관련 내용을 찾게 되었다.

 

요약해보면, mockStatic은 일시적인 구간에 대해 static class를 Mock시키기 위한 용도로 제작되었기 때문에 try-with-resource 와 같이 활용하는 것이 좋다고 적혀있다.

 

이것도 모르고 냅다 static에 정의하고 직접적으로 close를 하지 않았으니 mockStatic으로 할당되었던 자원들이 남아있게 되었고,

그 결과 static 클래스를 mock화시켰던 테스트가 먼저 실행되면 그 이후에 실행되었던 static 클래스가 실패했던 것이었다.

3. 해결 방법

공식 문서에서 추천했던대로, try-with-resource 구문과 함께 mockStatic을 사용해서 mock 구간이 끝나면 자동으로 static 클래스의 mock화를 해제하게 만들어서 해결했다.

4. 배운점

새로 배운 어떤 기술을 사용하면 꼭 공식 문서를 참고해보자.

 

 

** 참고 사이트 **

https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#48

 

Mockito - mockito-core 5.14.2 javadoc

Latest version of org.mockito:mockito-core https://javadoc.io/doc/org.mockito/mockito-core Current version 5.14.2 https://javadoc.io/doc/org.mockito/mockito-core/5.14.2 package-list path (used for javadoc generation -link option) https://javadoc.io/doc/org

javadoc.io