
JUnit은 자바 프로그래밍 언어에서 단위 테스트를 작성하고 실행하기 위한 오픈소스 프레임워크입니다. 애플리케이션의 개별 구성 요소(주로 메서드)를 테스트하여 구성 요소가 올바르게 동작하는지 검증하는 과정을 돕습니다.
주요 특징
그럼 몇 가지 어노테이션과 메소드를 정리해 보도록 하겠습니다.
@Test 어노테이션은 테스트 메소드를 지정하는 역할을 합니다. @Test 어노테이션이 붙은 메서드는 jUnit에서 테스트 메서드로 간주하고, 자동 실행이 가능하게 됩니다. @Test 메서드 내부에서는 assertEquals, assertTrue, assertFalse, assertThrows 같은 단언문을 사용하여 테스트 코드가 기대한 대로 동작하는지 확인합니다.
@Test 어노테이션이 붙은 메소드는 아래 캡처와 같이 초록색 테스트 실행 버튼이 노출됩니다(intelliJ).

@Test 메소드를 포함한 클래스 옆에도 노출되어, 클래스 내부의 테스트를 한 번에 동작하게 할 수도 있습니다.

@SpringBootTest 어노테이션은 Spring Boot에서 통합 테스트를 수행할 때 사용하는 어노테이션입니다. 이 어노테이션은 테스트 클래스에서 Spring 애플리케이션 컨텍스트를 로드하고, 애플리케이션의 거의 모든 부분을 실제와 동일하게 테스트할 수 있도록 환경을 구성합니다.
단, 실제와 동일한 환경을 구성하는 것은 테스트가 격리적으로 수행되기는 어렵게 만듭니다.
@SpringBootTest 사용 시 실제 DB와의 상호작용이 발생할 수 있다는 의미이고, 실무 DB에는 민감 정보나 삭제되면 안되는 정보가 존재하기 때문에 실무 DB 데이터를 테스트에 사용하는 것은 위험할 수 있습니다.
Mockito는 테스트가 격리적으로 수행될 수 있게 도와주는 프레임워크입니다. @SpringBootTest를 통합 테스트에 사용한다면, Mockito는 단위 테스트에 좀 더 적합합니다.
@SpringBootTest와 Mockito는 아래와 같은 차이점이 존재합니다.
Mockito를 이용한 단위 테스트 예제 코드를 살펴보겠습니다.
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import static org.mockito.Mockito.when;
import static org.junit.jupiter.api.Assertions.assertEquals;
// 서비스 클래스
class MyService {
private final MyRepository myRepository;
public MyService(MyRepository myRepository) {
this.myRepository = myRepository;
}
public String getDataById(int id) {
return myRepository.findDataById(id);
}
}
// 리포지토리 인터페이스
interface MyRepository {
String findDataById(int id);
}
// 테스트 클래스
@ExtendWith(MockitoExtension.class)
public class MyServiceTest {
@Mock
private MyRepository myRepository;
@InjectMocks
private MyService myService;
@Test
public void testGetDataById() {
// given
int id = 1;
String expectedData = "Mocked Data";
when(myRepository.findDataById(id)).thenReturn(expectedData);
// when
String actualData = myService.getDataById(id);
// then
assertEquals(expectedData, actualData);
}
}
given-when-then은 테스트 코드를 작성할 때 흔히 사용되는 패턴으로, 코드의 가독성을 높이고 테스트의 구조를 명확하게 하기 위한 방법입니다. 테스트의 단계를 논리적으로 분리해서, 테스트 작성자의 의도를 분명하게 표현하는 것을 도와줍니다.