SeouliteLab

[Java/자바] Mockito를 사용한 Java 테스트 코드 작성의 완벽 가이드 본문

카테고리 없음

[Java/자바] Mockito를 사용한 Java 테스트 코드 작성의 완벽 가이드

Seoulite Lab 2024. 3. 21. 21:49

효과적인 테스트 코드 작성은 Java 애플리케이션의 신뢰성과 견고성을 보장하는 데 중요합니다. Mockito는 인기 있는 목 객체(Mocking) 프레임워크로, 모의 객체를 생성하고 상호 작용을 확인하는 과정을 단순화합니다. 이 가이드에서는 Mockito를 사용하여 테스트 코드를 작성하는 방법을 상세히 설명하고 다양한 예제로 살펴보겠습니다.

Mockito 설정하기

Mockito를 사용하여 테스트 코드를 작성하기 전에 프로젝트에 필요한 종속성이 설정되어 있는지 확인하세요. Maven을 사용하는 경우 다음과 같은 종속성을 `pom.xml`에 포함시킵니다:

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>3.10.0</version> <!-- 필요에 따라 버전을 업데이트하세요 -->
    <scope>test</scope>
</dependency>

예제 1: 의존성 목(Mock) 생성

의존성 목(Mock) 생성

`UserService` 클래스가 `UserRepository`에 의존하는 상황을 가정해 보겠습니다. 테스트를 격리하기 위해 `UserRepository`를 목(Mock)으로 만들어 봅시다:

import static org.mockito.Mockito.*;

public class UserServiceTest {

    @Test
    public void testFindUserById() {
        // 목 UserRepository 생성
        UserRepository userRepository = mock(UserRepository.class);

        // 목 동작 설정
        User expectedUser = new User("123", "John Doe");
        when(userRepository.findById("123")).thenReturn(expectedUser);

        // UserService 테스트
        UserService userService = new UserService(userRepository);
        User actualUser = userService.findUserById("123");

        // 상호 작용 확인
        assertNotNull(actualUser);
        assertEquals("123", actualUser.getId());
        assertEquals("John Doe", actualUser.getName());

        // 메소드 호출 여부 확인
        verify(userRepository).findById("123");
    }
}

예제 2: 인자 매처(Argument Matchers) 사용

인자 매처(Argument Matchers) 사용

Mockito는 복잡한 시나리오를 다루기 위해 인자 매처를 제공합니다. 이를 사용하는 방법을 살펴봅시다:

import static org.mockito.ArgumentMatchers.*;

public class ShoppingCartTest {

    @Test
    public void testAddItemToCart() {
        // 목 객체 생성
        ShoppingCart cart = mock(ShoppingCart.class);
        Item item = new Item("ABC", "상품", 10.99);

        // 인자 매처를 사용하여 목 동작 설정
        when(cart.addItem(any(Item.class))).thenReturn(true);

        // ShoppingCart 테스트
        boolean added = cart.addItem(item);

        // 상품이 추가되었는지 확인
        assertTrue(added);

        // addItem이 아이템과 함께 호출되었는지 확인
        verify(cart).addItem(any(Item.class));
    }
}

 

예제 3: 예외 처리

예외 처리

Mockito를 사용하면 의존성이 던지는 예외를 모방할 수 있습니다. 이러한 시나리오를 처리하는 방법을 살펴봅시다:

public class PaymentServiceTest {

    @Test(expected = PaymentFailedException.class)
    public void testProcessPayment_ThrowsException() throws PaymentFailedException {
        // 목 객체 생성
        PaymentGateway paymentGateway = mock(PaymentGateway.class);

        // 예외를 던지도록 목 동작 설정
        when(paymentGateway.processPayment(anyDouble())).thenThrow(new PaymentFailedException("잔액 부족"));

        // PaymentService 테스트
        PaymentService paymentService = new PaymentService(paymentGateway);
        paymentService.processPayment(100.00); // 이 작업은 PaymentFailedException을 던져야 합니다
    }