
JUnit은 자바 애플리케이션을 위한 단위 테스트 프레임워크로, 테스트 주도 개발(TDD)을 지원하는 도구로써 JUnit을 사용하면 코드의 동작을 독립적으로 검증할 수 있어 안정성과 신뢰성을 높일 수 있습니다.
Mockito는 자바에서 객체의 행동을 모킹(Mocking)할 수 있도록 도와주는 프레임워크입니다. 실제 객체의 의존성을 제거하고 가짜 객체를 사용하여 테스트를 수행할 수 있습니다. 이를 통해 코드의 특정 부분만 독립적으로 테스트할 수 있습니다.
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: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(...) 메서드는 해당 메서드가 호출되었는지 검증합니다.
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 테스트에 필요한 의존 객체들을 목 객체로 생성합니다. 이를 통해 실제 객체를 사용하지 않고도 특정 객체의 동작을 시뮬레이션할 수 있습니다.
JUnit과 Mockito를 활용하면 보다 신뢰성 높은 코드를 작성하고 유지 보수할 수 있습니다. 이를 통해 코드의 품질을 높이고, 예상치 못한 버그를 미리 방지할 수 있습니다.