728x90
※ 일본의 한 블로그 글을 번역한 포스트입니다. 오역 및 의역, 직역이 있을 수 있으며 틀린 내용은 지적해주시면 감사하겠습니다.
테스트 대상 코드
테스트 대상 클래스
import org.springframework.stereotype.Service;
@Service
public class SampleService {
public String sampleMethod() {
// static메소드를 호출
return SampleStatic.staticMethod();
}
}
static 메소드를 가진 클래스
public class SampleStatic {
public static String staticMethod() {
return "real method";
}
}
테스트 코드
- build.gradle에 아래와 같이 추가
- 버전은 필요에 따라 지정
dependencies {
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.junit.jupiter:junit-jupiter:5.7.0'
testImplementation 'org.mockito:mockito-core:3.6.0'
testImplementation 'org.mockito:mockito-junit-jupiter:3.6.0'
testImplementation 'org.mockito:mockito-inline:3.6.0'
}
테스트 클래스
import org.junit.jupiter.api.Test;
import org.mockito.MockedStatic;
import static org.mockito.Mockito.mockStatic;
class SampleServiceTest {
// 테스트 대상의 클래스
private final SampleService target = new SampleService();
@Test
void test1() {
// 무엇도 하지 않고 실행
System.out.println(target.sampleMethod()); // real method라고 출력됨
// static 메소드를 Mock화
MockedStatic<SampleStatic> mockedStatic = mockStatic(SampleStatic.class);
mockedStatic.when(SampleStatic::staticMethod).thenReturn("mocked method");
// Mock화하여 실행
System.out.println(target.sampleMethod()); // mocked methodと出力される
// close하지 않으면 아래의 테스트에서 실패함
mockedStatic.close();
}
/**
* test1를 try-with-resources를 사용하여 작성해보기
*/
@Test
void test2() {
System.out.println(target.sampleMethod()); // real method라고 출력됨
try (MockedStatic<SampleStatic> mockedStatic = mockStatic(SampleStatic.class)) {
mockedStatic.when(SampleStatic::staticMethod).thenReturn("mocked method");
// Mock화하여 실행
System.out.println(target.sampleMethod()); // mocked method라고 출력됨
}
}
}
정리
포인트는 제대로 close()를 호출해야 테스트가 제대로 수행된다는 것이다.
try-with-resources를 사용하면 자동으로 close처리가 실행되지만, try등을 사용하지 않은 경우 close()하는 것을 잊지말자. close()하지 않으면 다음과 같은 에러가 발생할 것이다.
To create a new mock, the existing static mock registration must be deregistered
참고자료
728x90
'IT > 언어' 카테고리의 다른 글
[Java] 정규표현 (0) | 2023.07.26 |
---|---|
[JavaScript] Blob의 사용법 (0) | 2023.07.21 |
[Junit] private 메소드 테스트하는 방법 (0) | 2023.05.31 |
[Java] String.format 사용법 (0) | 2023.05.30 |
[Java] 자주 사용되는 Lombok 어노테이션 (0) | 2023.05.15 |