[java] JUnit에서 모의 객체(Mockito) 사용하기

JUnit은 Java에서 단위 테스트를 작성하는 데 사용되는 일반적으로 알려진 프레임워크입니다. 단위 테스트는 개별적인 코드 조각 또는 기능을 격리하여 테스트하는 프로세스입니다. 이를 통해 코드의 정확성을 확인하고 버그를 이해하는 데 도움이 됩니다.

모의 객체(Mockito)는 단위 테스트를 작성할 때 유용한 도구입니다. 모의 객체는 실제 객체와 유사한 동작을 흉내내면서도 프로그래머가 원하는 방식으로 행동할 수 있도록 만들어진 객체입니다. 이를 통해 특정 메소드가 예상대로 동작하는지 검증하고, 협력 객체를 목업하여 테스트에 필요한 환경을 구성할 수 있습니다.

Mockito 설치

Mockito를 사용하기 위해서는 먼저 Mockito 라이브러리를 프로젝트에 추가해야 합니다. Maven을 사용하는 경우, pom.xml 파일에 다음 의존성을 추가합니다.

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>3.10.0</version>
    <scope>test</scope>
</dependency>

Gradle을 사용하는 경우, build.gradle 파일에 다음 의존성을 추가합니다.

testImplementation 'org.mockito:mockito-core:3.10.0'

의존성을 추가한 후에는 프로젝트를 다시 빌드하여 Mockito를 사용할 준비를 마칠 수 있습니다.

Mockito를 사용한 모의 객체 생성하기

Mockito를 사용하여 모의 객체를 생성하는 방법은 간단합니다. 다음은 Mockito를 사용하여 Calculator 클래스의 모의 객체를 생성하는 예시입니다.

import static org.mockito.Mockito.*;

public class CalculatorTest {

    @Test
    public void testAdd() {
        // 모의 객체 생성
        Calculator calculatorMock = mock(Calculator.class);
        
        // 모의 객체의 동작 설정
        when(calculatorMock.add(2, 3)).thenReturn(5); 
        
        // 모의 객체 사용
        int result = calculatorMock.add(2, 3);
        
        // 결과 검증
        assertEquals(5, result);
    }
}

위의 예시에서는 mock() 메소드를 사용하여 Calculator 클래스의 모의 객체를 생성합니다. when() 메소드와 thenReturn() 메소드를 사용하여 모의 객체의 동작을 설정합니다. 이후에는 모의 객체를 사용하여 메소드를 호출하고, 결과를 검증할 수 있습니다.

Mockito를 사용한 메소드 호출 검증하기

Mockito를 사용하면 특정 메소드가 예상대로 호출되는지 검증할 수 있습니다. 다음은 Mockito를 사용하여 Calculator 클래스의 multiply 메소드가 두 번 호출되는지 검증하는 예시입니다.

import static org.mockito.Mockito.*;

public class CalculatorTest {

    @Test
    public void testMultiply() {
        // 모의 객체 생성
        Calculator calculatorMock = mock(Calculator.class);
        
        // 모의 객체 사용
        calculatorMock.multiply(2, 3);
        calculatorMock.multiply(4, 5);
        
        // 메소드 호출 검증
        verify(calculatorMock, times(2)).multiply(anyInt(), anyInt());
    }
}

위의 예시에서는 verify() 메소드를 사용하여 multiply() 메소드가 times(2)와 일치하는 횟수만큼 호출되는지 검증합니다. anyInt()는 모든 정수 값에 일치한다는 의미입니다.

결론

JUnit에서 Mockito를 사용하여 모의 객체를 생성하고 메소드 호출을 검증하는 방법에 대해 알아보았습니다. Mockito를 사용하면 단위 테스트를 좀 더 효과적으로 작성할 수 있으며, 코드의 정확성을 검증하고 버그를 발견하는 데 도움이 됩니다.

더 많은 Mockito 기능과 사용 예시는 공식 Mockito 문서를 참조하시기 바랍니다.

Happy testing!