JUnit5란?
Java 애플리케이션을 테스트하기 위한 프레임워크
JUnit5의 구성
JUnit Platform : 테스트를 실행해주는 엔진
JUnit Jupiter : 우리가 직접 쓰는 어노테이션(@Test, @BeforeEach)과 API가 들어있어
JUnit Vintage : 예전 JUnit4 코드도 호환할 수 있게 해주는 모듈자주 사용하는 어노테이션
@Test : 테스트 메서드임을 표시
@BeforeEach: 각 테스트 전에 실행되는 코드
@AfterEach : 각 테스트 후에 실행되는 코드
@BeforeAll : 모든 테스트 전에 딱 한 번 실행됨 (static이어야 함)
@AfterAll : 모든 테스트 후에 딱 한 번 실행됨 (static이어야 함)
JUnit과 함께 사용하는 테스트 도구들
1. @SpringBootTest
Spring 전체 컨텍스트를 로딩해서 테스트함 (진짜 어플리케이션 실행하듯)
@Autowired 등 다 잘 작동함
무거운 테스트라서 느릴 수 있음2. @Transactional
테스트 안에서 DB에 insert/update/delete 한 거를 테스트 끝나면 자동 롤백해줌
실제 DB를 건드리면서 테스트할 때 매우 유용함3. @WebMvcTest
컨트롤러만 테스트할 때 사용
컨트롤러 외의 빈들은 자동으로 mock 처리됨
실제 서비스나 리포지토리를 사용하려면 @MockBean으로 추가해야 함
Mock이란?
실제 객체를 대신해주는 테스트용 객체를 생성해 줄 때, mock을 사용
Mockito란?
자바에서 Mock 객체를 쉽게 만들고, 동작을 지정하고, 검증할 수 있게 해주는 테스트 전용 라이브러리
서비스 → 리포지토리, 컨트롤러 → 서비스 등 하위 계층을 직접 실행하지 않고, 흉내만 낼 때 사용
클래스에 @ExtendWith(MockitoExtension.class)를 붙여 @Mock 어노테이션 사용 가능@Mock 애노테이션
Mockito.mock() 메서드의 축약어, 테스트 클래스에서만 사용 가능
단위 테스트에서 사용되며, Mock 객체를 직접 생성하므로 Spring Context와 관련이 없다.@MockBean 애노테이션
통합 테스트에서 사용되며, Spring Context에 Mock객체를 직접 생성한다
@WebMvcTest와 함께 자주 사용한다.@InjectMocks
Mocking된 객체를 자동으로 주입해주는 애노테이션. 테스트하려는 객체(예: 서비스 클래스)에서 필요로 하는 의존성 필드들을 자동으로 주입해 준다.
Stub이란?
특정 동작을 미리 정의해둔 Mock
쓰이는 메소드들
when(userService.getName(1L)).thenReturn("철수"); when(orderService.placeOrder(any())).thenThrow(new RuntimeException("실패")); doReturn(100).when(mathService).add(50, 50); when(userService.getGreeting(anyString())) .thenAnswer(invocation -> "Hello, " + invocation.getArgument(0));
thenAnswer은 동적으로 결과를 튜닝할 수 있다.