@Mock : Mapper를 가짜(mock) 객체로 만든다.
→ 실제 DB 접근 없이 테스트 가능하게 함.
예시
private ReservationMapper reservationMapper; --> 필수로 필요private final Long memberId = 3L; --> set해줄 값이 필요할 때만
private final String role = "DROPPER";
private final String state = "CONFIRMED";
@InjectMocks : 해당Mapper를 주입해 해당ServiceImpl 인스턴스를 만들어준다
예시
private ReservationServiceImpl reservationService;
@BeforeEach : 테스트 시작 전 초기화
매 테스트 메서드 실행 전에 Mockito가 @Mock, @InjectMocks를 초기화해서 사용할 수 있게 함.
@BeforeEach
public void setUp() {
MockitoAnnotations.openMocks(this); // @Mock과 @InjectMocks 초기화
}
1. given : 테스트 조건 생성
DTO객체를 생성해줍니다.
set을 사용해서 dto에서 필요한 값을 생성해줍니다.
Mockito를 사용해 특정 메서드 호출 시 원하는 값을 리턴하도록 설정합니다.
ex) Mockito.when(Mapper.findUserById(lockerId)).thenReturn(mockResponse); : Mapper.findUserById(lockerId) 호출 시, 실제 DB를 조회하지 않고 mockResponse를 반환하라는 뜻
**<예시>**
해당DTO명 mockResponse = new 해당DTO명(); //find 테스트 (객체 생성)
//해당DTO명 mockRequest = new 해당DTO명(); //insert 테스트 (객체 생성)
mockResponse.setLockerId(lockerId);
mockResponse.setLockerName("테스트 락커");
List<String> mockImages = List.of("img1.jpg", "img2");
//find 테스트
Mockito.when(Mapper.findUserById(lockerId)).thenReturn(mockResponse);
Mockito.when(Mapper.findImageById(lockerId)).thenReturn(mockImages);
//insert 테스트
//Mockito.doNothing().when(Mapper).insert(mockRequest);
//Mockito.when(Mapper.findLastInsertedId()).thenReturn(1L);
2. when : 실제 테스트 대상 메서드 호출
서비스 메서드를 호출하고 그 결과를 해당 DTO로 받아옵니다.
**<예시>**
//find 테스트
해당DTO명 result = Service.findUserById(lockerId);
//insert 테스트
Long lockerId = lockerService.registerLocker(mockRequest);
3. then : 결과 검증
결과값이 기대값인지 확인합니다.
<단위 테스트에서 결과를 검증할 때 사용하는 메서드>
assertNotNull(~) : null이 아닌지 검사
assertEquals(확인할 값, get해준 값) : 기대값인지 확인
assertTrue () : 해당 값이 ture
assertNotNull(서비스 매서드 결과값) : 서비스 매서드 결과값이 null이 아닌지 검사
assertEquals(확인할 값, 매서드 결과값.get해준 값) : 기대값인지 확인
**<예시>**
assertNotNull(result);
assertEquals(lockerId, result.getLockerId());
assertEquals("테스트 락커", result.getLockerName());
assertEquals(2, result.getImages().size());
assertEquals("img1.jpg", result.getImages().get(0));
1. given
2. when
**<예시>**
Exception exception = assertThrows(LockerException.class, () -> {
Service.findUserById(lockerId);
});
3. then
**<예시>**
assertSame(BaseResponseStatus.NOT_FOUND_LOCKERDETAILS, exception.getBaseResponseStatus());
예시
정상 케이스 vs 예외 케이스
파라미터 유효성 검사
< 의존성 추가 >
<!-- JUnit5 -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.5.0</version>
<scope>test</scope>
</dependency>
<!--JUnit 5 - Mockito-->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>5.11.0</version>
<scope>test</scope>
</dependency>
좋은 정보 감사합니당!