IT/언어

[Junit] static 메소드의 Mock화

개발자 두더지 2023. 7. 11. 21:59
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

참고자료

https://hosochin.com/2022/06/08/post-1233/

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