Mock 은 가짜 객체 입니다.
@Mock
Repository repo ;
는
그냥 repository 인척 하는 것입니다.
예 를 들면 이런 service 코드 가 있습니다.
@Transactional
public Long updateSchedule(Long id, ScheduleRequestDto requestDto, User user) {
// DB에 존재하는지 확인
Schedule sc = ScRepository.findById(id).orElseThrow(()-> new NoSuchElementException("해당 일정 찾을수 없습니다."));;
// 유저 확인.
if(sc.getUser().getId().equals(user.getId())){
// 내용 수정
sc.update(requestDto);
}
else {
throw new IllegalStateException("유저가 다릅니다!!!!");
}
return id;
}
여기서 해야 할거
1. @Mock repo 만들기
2. given (or when) 으로 @Mock 으로 하는 작업 의 결과값 을 미리 만들어 줘야 합니다.
( @Mock 객체는 NULL 만 뱉어 내기 때문에 given 같은 걸로 가짜 결과를 만들어냄)
실제 서비스 안에 ScheduleRepository.findById(1L)).......
즉
우리 가짜 객체도 저걸 해야하는데 얘는 실제 db 작업을 하지 않는다.....
그래서 미리 지정해주는 것!
1 결과값 미리 만들기
User user = new User("user","user","user@gmail.com", UserRoleEnum.USER);
user.setId(1L);
ScheduleRequestDto requestDto = new ScheduleRequestDto();
requestDto.setContents("테스트용 스케줄 변경 합니다");
Schedule schedule = new Schedule(requestDto,user);
2. given 으로 지정
findById(1L) 을 해야 하면 Optional.of(schedule)
given(MockScheduleRepository.findById(user.getId())).willReturn(Optional.of(schedule));
그러면 findById(1L)) 할때 미리 만들어 놓은 객체 schedule 을 반환한다.
테스트 마지막엔 AssertEquals
assertEquals(1L,l);
--------- 전부다 하면 -----------
@Test
void update(){
//given
User user = new User("user","user","user@gmail.com", UserRoleEnum.USER);
user.setId(1L);
ScheduleRequestDto requestDto = new ScheduleRequestDto();
requestDto.setContents("테스트용 스케줄 변경 합니다");
Schedule schedule = new Schedule(requestDto,user);
ScheduleService scheduleService = new ScheduleService(MockScheduleRepository);
//when
given(MockScheduleRepository.findById(1L)).willReturn(Optional.of(schedule));
Long l = scheduleService.updateSchedule(1L, requestDto, user);
//then
assertEquals(1L,l);
}
'Spring' 카테고리의 다른 글
| RawJPA (0) | 2024.03.04 |
|---|---|
| JPA 심화.(INTRO) (0) | 2024.03.04 |
| Error 메시지 관리하기 + global 에 적용예시. (0) | 2024.02.19 |
| Spring global 예외처리 (0) | 2024.02.19 |
| Spring API 예외처리 / ResponseEntitiy (0) | 2024.02.19 |