개발자들은 자신들이 작성한 코드를 테스트하는 데 많은 시간을 할애합니다. 이러한 이유로, 테스트 코드 작성은 매우 중요한 프로세스입니다. JUnit은 Java 개발자들이 테스트 코드를 작성하고 실행하는 데 도움을 주는 인기있는 프레임워크입니다. JUnit은 테스트 더블을 사용하여 의존성을 제어하고 테스트를 더 효율적으로 수행할 수 있습니다.
테스트 더블은 일반적으로 다른 객체들과의 상호작용을 대신하기 위해 사용됩니다. JUnit에서는 다음과 같은 네 가지 유형의 테스트 더블을 지원합니다.
-
더미 (Dummy): 메서드를 호출하지 않거나 아무 기능도 수행하지 않는 객체입니다. 주로 매개변수로 사용되며, 객체의 존재 여부만 확인하려는 경우에 유용합니다.
-
스텁 (Stub): 특정한 시나리오에 대한 사전 정의된 결과를 반환하는 객체입니다. 주로 메서드를 호출하고 그에 대한 고정된 값을 반환하는 경우에 사용됩니다.
-
스파이 (Spy): 실제 객체와 같은 동작을 수행하지만, 객체와의 상호작용 정보를 기록할 수 있습니다. 주로 메서드 호출 및 인수 확인에 사용됩니다.
-
모의 객체 (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에서 테스트 더블을 효과적으로 사용하는 것은 소프트웨어 개발에서 중요한 요소입니다.
참고 자료
- JUnit 5 User Guide
- Mockito Documentation
- Test Doubles by Martin Fowler