Spring

Service 테스트 / Mock 초간단 요약.

sehunbang 2024. 2. 26. 20:31

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);
}