[Spring Boot] Junit과 Mock기반의 테스트코드 짜기

nano·2025년 1월 5일

Spring Boot

목록 보기
3/4
post-thumbnail

1. JUnit이란?

JUnit은 자바 애플리케이션을 위한 단위 테스트 프레임워크로, 테스트 주도 개발(TDD)을 지원하는 도구로써 JUnit을 사용하면 코드의 동작을 독립적으로 검증할 수 있어 안정성과 신뢰성을 높일 수 있습니다.


2. Mockito란?

Mockito는 자바에서 객체의 행동을 모킹(Mocking)할 수 있도록 도와주는 프레임워크입니다. 실제 객체의 의존성을 제거하고 가짜 객체를 사용하여 테스트를 수행할 수 있습니다. 이를 통해 코드의 특정 부분만 독립적으로 테스트할 수 있습니다.


3. JUnit 기본 사용법

JUnit을 사용하여 테스트 케이스를 작성하는 기본 예제는 다음과 같이 볼 수 있다.

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;

public class CalculatorTest {

    @Test
    public void testAddition() {
        Calculator calculator = new Calculator();
        int result = calculator.add(2, 3);
        assertEquals(5, result, "2 + 3은 5여야 합니다.");
    }
}
  • @Test:
    • 어노테이션은 해당 메서드가 테스트 메서드임을 나타낸다.
  • assertEquals:
    • 메서드는 기대값과 실제값을 비교하여 테스트가 성공했는지를 검증한다.

4. Mockito 기본 사용법

Mockito를 사용하여 의존성을 모킹하는 기본 예제는 다음과 같습니다.

import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.Test;

public class UserServiceTest {

    @Test
    public void testGetUserName() {
        // Mocking UserRepository
        UserRepository mockRepository = mock(UserRepository.class);
        when(mockRepository.getUserName(1)).thenReturn("John Doe");

        UserService userService = new UserService(mockRepository);
        String userName = userService.getUserName(1);

        assertEquals("John Doe", userName);
        verify(mockRepository).getUserName(1);
    }
}

위 예제에서 mock(UserRepository.class)UserRepository 인터페이스의 모의 객체를 생성합니다.
when(...).thenReturn(...) 구문은 특정 메서드 호출에 대한 예상 결과를 설정합니다.
verify(...) 메서드는 해당 메서드가 호출되었는지 검증합니다.

5. JUnit과 Mockito를 함께 사용하는 방법

JUnit과 Mockito를 함께 사용하면 단위 테스트에서 객체 간의 의존성을 최소화하면서 더욱 효율적으로 테스트를 작성할 수 있습니다. 아래는 Spring Boot 애플리케이션에서 JUnit과 Mockito를 함께 사용하는 예제입니다.

import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.beans.factory.annotation.Autowired;

@ExtendWith(MockitoExtension.class)
public class OrderServiceTest {

    @InjectMocks
    OrderService orderService;
    
    @Mock
    OrderRepository orderRepository;

    @Test
    public void testPlaceOrder() {
        Order order = new Order(1, "Laptop", 2);
        when(orderRepository.save(order)).thenReturn(order);

        Order savedOrder = orderService.placeOrder(order);
        assertEquals(order, savedOrder);
        verify(orderRepository).save(order);
    }
}

@InjectMocks 테스트 대상 클래스의 인스턴스를 생성하고, @Mock으로 생성된 목 객체들을 주입합니다. 이 어노테이션을 사용하면 의존성이 주입된 객체를 수동으로 생성하지 않아도 됩니다.

@Mock 테스트에 필요한 의존 객체들을 목 객체로 생성합니다. 이를 통해 실제 객체를 사용하지 않고도 특정 객체의 동작을 시뮬레이션할 수 있습니다.

6. 테스트 코드 작성시 주의사항

  • 독립성 보장: 각 테스트는 독립적으로 실행되어야 하며, 다른 테스트에 영향을 주지 않아야 합니다.
  • 명확한 검증: 테스트의 목적은 명확해야 하며, 기대하는 결과를 명확히 검증해야 합니다.
  • 적절한 모킹: 필요 이상으로 모킹을 남발하지 말고, 실제 객체와의 상호작용을 제대로 테스트하는 것도 중요합니다.
  • 코드 커버리지: 테스트 커버리지를 높이기 위해 다양한 경로와 예외 상황도 테스트해야 합니다.

JUnit과 Mockito를 활용하면 보다 신뢰성 높은 코드를 작성하고 유지 보수할 수 있습니다. 이를 통해 코드의 품질을 높이고, 예상치 못한 버그를 미리 방지할 수 있습니다.

0개의 댓글