BDDMockito는 Behavior-Driven Development (BDD) 스타일의 단위 테스트를 작성하기 위해 Mockito 프레임워크를 확장한 것이다. BDDMockito는 주로 Java 애플리케이션에서 사용되며, 테스트 코드가 더 읽기 쉽고 명확하게 작성되도록 도와준다.
BDDMockito의 장점
- 가독성 향상: BDD 스타일의 테스트는 테스트 코드의 가독성을 높여, 테스트 목적을 더 명확하게 표현할 수 있다.
- 행동 중심: Given-When-Then 패턴을 통해, 테스트 케이스를 시스템의 동작과 일치시킬 수 있다.
- 명확한 의도 표현: BDD 스타일의 테스트는 코드의 의도를 더 명확하게 표현하여, 테스트 케이스를 이해하고 유지보수하기 쉽게 만든다.
BDDMockito의 주요 메서드
- given: 테스트 준비 단계에서 사용되며, when의 BDD 버전
- willReturn: 특정 조건에서 메서드 호출에 대해 반환할 값을 설정
- willThrow: 특정 조건에서 예외를 던지도록 설정
- willAnswer: 특정 조건에서 사용자 정의 동작을 설정
- willDoNothing: 아무런 동작도 하지 않도록 설정
- willCallRealMethod: 실제 메서드를 호출하도록 설정
기본적인 사용법
import static org.mockito.BDDMockito.*;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.junit.jupiter.api.extension.ExtendWith;
@ExtendWith(MockitoExtension.class)
public class SomeServiceTests {
@Mock
private SomeRepository repository;
@InjectMocks
private SomeService service;
@Test
void testFindById() {
// Given
SomeEntity entity = new SomeEntity();
given(repository.findById(1L)).willReturn(Optional.of(entity));
// When
SomeEntity result = service.findById(1L).orElse(null);
// Then
assertNotNull(result);
then(repository).should().findById(1L);
}
}
예외를 던지는 경우
import static org.mockito.BDDMockito.*;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.junit.jupiter.api.extension.ExtendWith;
@ExtendWith(MockitoExtension.class)
public class SomeServiceTests {
@Mock
private SomeRepository repository;
@InjectMocks
private SomeService service;
@Test
void testFindByIdThrowsException() {
// Given
given(repository.findById(1L)).willThrow(new RuntimeException("DB Error"));
// When/Then
assertThrows(RuntimeException.class, () -> service.findById(1L));
then(repository).should().findById(1L);
}
}
사용자 정의 동작 설정
import static org.mockito.BDDMockito.*;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.junit.jupiter.api.extension.ExtendWith;
@ExtendWith(MockitoExtension.class)
public class SomeServiceTests {
@Mock
private SomeRepository repository;
@InjectMocks
private SomeService service;
@Test
void testFindByIdWithCustomAnswer() {
// Given
given(repository.findById(1L)).willAnswer(invocation -> {
Long id = invocation.getArgument(0);
return Optional.of(new SomeEntity(id));
});
// When
SomeEntity result = service.findById(1L).orElse(null);
// Then
assertNotNull(result);
assertEquals(1L, result.getId());
then(repository).should().findById(1L);
}
}
728x90
'JVM' 카테고리의 다른 글
[JVM] Jackson의 ObjectMapper: 객체 생성 방식과 필드 바인딩 (0) | 2024.08.10 |
---|---|
[JVM] MockServer (0) | 2024.07.29 |
JUnit (0) | 2024.07.28 |
테스트 커버리지와 JaCoCo (0) | 2024.07.27 |
StringBuffer vs StringBuilder (0) | 2024.07.22 |