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의 버전만 우선적으로 올리고 추후에 프로젝트 버전이 올라가면 그때 제거할 생각이다.
<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{
...
}
}
현재 버전에 맞게 다음과 같이 테스트 코드를 작성하면 된다.