반응형

Mockito 는 Java 에서 테스트 코드를 작성하는데 자주 사용되는 테스트 프레임워크입니다.

하지만 기존에 Mockito 는 치명적인 단점이 있었는데요. 그건 바로 static 메소드나 필드에 대해 mocking 을 지원하지 않는다는 것이었습니다. 그래서 static 에 대해서는 테스트를 포기하거나, 대안으로 PowerMock 를 사용해야 했었는데요. 

 

Mockito 도 3.4.0 버전부터 드디어 static 을 지원하게 되면서, 이제 Mockito 만을 사용해서도 강력한 테스트가 가능하게 됐습니다.

 

사용 방법도 크게 어렵지 않은데요. 간단한 예제와 함께 알아보도록 하겠습니다.

 

예제

간단하게 Calculator 클래스를 만들어서 static 메소드 하나와 인스턴스 메소드 하나를 선언해보겠습니다.

 

public class Calculator {
    public static int add(int x, int y) {
        return x + y;
    }

    public int multiply(int x, int y) {
        return x * y;
    }
}

 

이제 테스트 코드를 작성해볼텐데요. 기존의 Mockito 를 통해 아래와 같이 작성한다면 테스트가 실패하게 됩니다.

import org.junit.*;

import static org.junit.Assert.*;
import static org.mockito.Mockito.*;


public class CalculatorTest {
    @Test
    public void testStaticAdd() {
        // given
        when(Calculator.add(anyInt(), anyInt())).thenReturn(100);

        // when
        int sum = Calculator.add(10, 20);

        // then
        assertEquals(100, sum);
    }
}

 

원래라면 when().thenReturn() 을 통해서 특정 메소드에 대해 리턴 값을 지정할 수 있는데요. 위와 같이 static 메소드에 대해서는 해당 Mocking 이 불가능 했었습니다.

 

하지만, 이제 Mockito 를 사용해서도 static method 에 대해 Mocking 이 가능하게 됐습니다. 방법은 아래와 같습니다.

 

import org.junit.*;
import org.mockito.MockedStatic;

import static org.junit.Assert.*;
import static org.mockito.Mockito.*;


public class CalculatorTest {
    private Calculator calculator;
    private static MockedStatic<Calculator> mockedCalculator;

    @BeforeClass
    public static void beforeClass() {
        mockedCalculator = mockStatic(Calculator.class);
    }

    @AfterClass
    public static void afterClass() {
        mockedCalculator.close();
    }

    @Before
    public void setUp() {
        calculator = new Calculator();
    }

    @Test
    public void testStaticAdd() {
        // given
        when(Calculator.add(anyInt(), anyInt())).thenReturn(100);

        // when
        int sum = Calculator.add(10, 20);

        // then
        assertEquals(100, sum);
    }

    @Test
    public void testMultiply() {
        // when
        int result = calculator.multiply(2, 5);

        // then
        assertEquals(10, result);
    }
}

 

먼저 MockedStatic 객체를 선언합니다. 그리고 제네릭 타입으로 내가 Mocking 하고자 하는 클래스(위 예제에서는 Calculator)를 선언하고서, @BeforeClass 어노테이션을 붙인 메소드를 정의합니다. 이때, 주의할 점은 static 메소드로 선언해야 합니다.

 

선언이 되었다면, @BeforeClass 가 붙은 메소드에서 MockedStatic 객체에 mockStatic() 메소드를 사용하여 mocking 을 해줍니다. 이 과정이 완료되었다면, 이후로는 위 예제의 testStaticAdd() 함수 내에서 사용한 것처럼 해당 객체의 static method에 대해서는 when().thenReturn() 을 통해 mocking 할 수 있습니다.

 

최근 버전에서는 static 이외에도 mockConstruction() 을 제공하고 있는데요. 생성자 내에서 특정 객체에 대해 생성해야 하는데 해당 객체에 대해서도 Mocking 해야하는 경우에 사용할 수 있습니다.

 

기존에 Mockito 를 사용하고 계시던 분들도 최근에 배포된 버전을 참고하셔서 보다 강력하게 테스트 코드를 작성하시면 좋을 것 같습니다.

 


위 예제의 전체 코드는 Github 에서 확인하실 수 있습니다.

반응형
반응형