[java] JUnit에서 테스트 더블 사용하기

개발자들은 자신들이 작성한 코드를 테스트하는 데 많은 시간을 할애합니다. 이러한 이유로, 테스트 코드 작성은 매우 중요한 프로세스입니다. JUnit은 Java 개발자들이 테스트 코드를 작성하고 실행하는 데 도움을 주는 인기있는 프레임워크입니다. JUnit은 테스트 더블을 사용하여 의존성을 제어하고 테스트를 더 효율적으로 수행할 수 있습니다.

테스트 더블은 일반적으로 다른 객체들과의 상호작용을 대신하기 위해 사용됩니다. JUnit에서는 다음과 같은 네 가지 유형의 테스트 더블을 지원합니다.

  1. 더미 (Dummy): 메서드를 호출하지 않거나 아무 기능도 수행하지 않는 객체입니다. 주로 매개변수로 사용되며, 객체의 존재 여부만 확인하려는 경우에 유용합니다.

  2. 스텁 (Stub): 특정한 시나리오에 대한 사전 정의된 결과를 반환하는 객체입니다. 주로 메서드를 호출하고 그에 대한 고정된 값을 반환하는 경우에 사용됩니다.

  3. 스파이 (Spy): 실제 객체와 같은 동작을 수행하지만, 객체와의 상호작용 정보를 기록할 수 있습니다. 주로 메서드 호출 및 인수 확인에 사용됩니다.

  4. 모의 객체 (Mock): 미리 정의된 예상 동작을 가지는 객체이며, 테스트 중에 예상 동작에 따라 객체와의 상호작용을 검증할 수 있습니다.

이제 JUnit에서 테스트 더블을 사용하는 간단한 예제를 살펴보겠습니다.

import static org.mockito.Mockito.*;

public class ExampleTest {
    @Test
    public void testA() {
        // 스텁 생성
        SomeDependency dependency = mock(SomeDependency.class);
        when(dependency.someMethod()).thenReturn("mocked result");
        
        // 테스트 대상 객체 생성
        MyClass myClass = new MyClass(dependency);
        
        // 검증
        assertEquals("mocked result", myClass.someMethodUnderTest());
        verify(dependency).someMethod();
    }
}

이 예제에서는 SomeDependency 클래스의 someMethod 메서드를 스텁으로 대체하여 테스트를 수행합니다. when 메서드를 사용하여 스텁을 설정하고, 테스트 대상 객체 MyClass를 생성하여 테스트를 실행합니다. 마지막으로 verify 메서드를 사용하여 스텁이 호출되었는지를 확인합니다.

테스트 더블은 JUnit을 사용하여 테스트 코드를 작성할 때 매우 유용합니다. 의존성을 제어하고 원하는 대로 테스트를 설정하고 실행할 수 있기 때문입니다. 따라서 JUnit에서 테스트 더블을 효과적으로 사용하는 것은 소프트웨어 개발에서 중요한 요소입니다.

참고 자료