static class를 mocking해야할 때 (w. mockito-inline)

최준호·2024년 2월 26일
0

업무

목록 보기
30/31
post-thumbnail

참고 mockito-inline 참고

🔴 mockito-inline

mockito-inline 이전에 power mockito라는 라이브러리를 통해 static mehtod를 테스트할 수 있었다. 하지만 mockito에서 3.4.0 이후로 mockito-inline이라는 라이브러리를 추가하여 static mehtod도 테스트할 수 있도록 추가해주었다고 한다. 해당 라이브러리를 통해 static class의 mehtod를 테스트해보자.

🟠 참고할 점

물론 구조가 잘 잡힌 프로젝트라면 이렇게 static method를 mocking하는 일은 없을 수도 있다. 하지만 우리는 개인 프로젝트가 아닌 회사의 플젝을 해결해 가야 하는 입장으로... 잘 돌아가고 있는 static method에 대한 테스트 코드를 작성해야할 일이 생길수도 있다...

또한 static method를 mocking하는 것은 좋은 패턴이 아닌 안티패턴이라고 하니 해당 부분을 참고하여 진행해보자.

🟠 주의할 점

나의 경우 프로젝트의 Spring Boot version이 1.5.2였었는데 해당 버전의 경우 mockito의 버전이 1.x라고 한다. mockito-inline은 mockito 3.4.0 이후로 사용할 수 있으므로 해당 의존성을 추가해서 진행을 하거나 혹은 Spring Boot 버전을 올려서 사용하는 것을 추천한다.

나의 경우 해당 프로젝트의 버전업이 예정되어 있긴 하나 아직 기간이 좀 남아있어 mockito의 버전만 우선적으로 올리고 추후에 프로젝트 버전이 올라가면 그때 제거할 생각이다.

🟠 mockito-inline 적용

🟢 의존성 추가

<dependency>
  <groupId>org.mockito</groupId>
  <artifactId>mockito-inline</artifactId>
  <version>4.6.1</version>
  <scope>test</scope>
</dependency>

해당 프로젝트의 경우 gradle로 변경될 예정이지만 현재는 maven이기에 다음과 같이 추가해주었다.
gradle의 경우

testImplementation('org.mockito:mockito-inline:4.6.1')

추가해주면 된다.

🟢 코드 작성

try(MockedStatic<HttpUtil> http = mockStatic(HttpUtil.class)) {
	...do something
}

기본적으로 코드는 다음과 같이 작성할 수 있다.
try-resource 형식으로 작성하여 자원을 자동으로 close해주면 된다. 아니면 try-finally 형식으로 닫아도 되고

근데 이렇게 작성하면 문제가 mockStatic 이 close() 되기 전인 try문 안에서 실제 실행이 일어나야 된다. 그렇게 되면 거의 모든 소스가 try 안으로 들어가야 하게 되어 소스가 이쁘지 않다.

🟢 코드 재작성

@RunWith(MockitoJUnitRunner.class)
public class ServiceTest {

    @InjectMocks
    private Service service;

    private static MockedStatic httpUtil = null;

    @BeforeClass
    public static void before() throws Exception{
        httpUtil = mockStatic(HttpUtil.class);
    }

    @AfterClass
    public static void after() {
        httpUtil.close();
    }

    @Test
    public void 테스트() throws Exception{
		...
    }
}

현재 버전에 맞게 다음과 같이 테스트 코드를 작성하면 된다.

profile
코딩을 깔끔하게 하고 싶어하는 초보 개발자 (편하게 글을 쓰기위해 반말체를 사용하고 있습니다! 양해 부탁드려요!) 현재 KakaoVX 근무중입니다!

0개의 댓글