verify
times
MemberService에 notify 추가
public interface MemberService {
Optional<Member> findById(Long memberId) throws MemberNotFoundException;
void validate(Long memberId);
void notify(Study newstudy);
}
StudyService의 createNewStudy에 notify 호출
public Study createNewStudy(Long memberId, Study study) {
Optional<Member> member = memberService.findById(memberId);
study.setOwner(member.orElseThrow(() -> new IllegalArgumentException("Member doesn't exist for id: '" + memberId + "'")));
Study newstudy = repository.save(study);
memberService.notify(newstudy);
return repository.save(study);
}
테스트 코드에 verify 작성
@Test
void createStudyService() {
StudyService studyService = new StudyService(memberService,studyRepository);
assertNotNull(studyService);
Member member = new Member();
member.setId(1L);
member.setEmail("rownsdn912@gmail.com");
Study study = new Study(10,"test");
when(memberService.findById(1L)).thenReturn(Optional.of(member));
when(studyRepository.save(study)).thenReturn(study);
studyService.createNewStudy(1L, study);
assertEquals(member, study.getOwner());
verify(memberService, times(1)).notify(study);
}
MemberService의 notifty() 메서드가 한 번은 무조건 호출되어야 함을 강제시킨다.
만약 notify 호출 부를 주석 처리한다면
public Study createNewStudy(Long memberId, Study study) {
Optional<Member> member = memberService.findById(memberId);
study.setOwner(member.orElseThrow(() -> new IllegalArgumentException("Member doesn't exist for id: '" + memberId + "'")));
Study newstudy = repository.save(study);
//memberService.notify(newstudy);
return repository.save(study);
}
never
한 번도 호출이 안되어야 함을 강제한다.
verify(memberService, never()).validate(any());
inOrder
호출 순서를 체크한다.
public Study createNewStudy(Long memberId, Study study) {
Optional<Member> member = memberService.findById(memberId);
study.setOwner(member.orElseThrow(() -> new IllegalArgumentException("Member doesn't exist for id: '" + memberId + "'")));
Study newstudy = repository.save(study);
memberService.notify(newstudy);
memberService.notify(member.get());
return repository.save(study);
}
똑같은 notify처럼 보일지 몰라도
첫 번째는 study를 공지하고
두 번째는 멤버들 에게 공지하는 notify이다.
이때 호출 순서를 체크하고 싶다면 하위 코드처럼 inOrder를 사용하면 된다.
InOrder inOrder = inOrder(memberService);
inOrder.verify(memberService).notify(study);
inOrder.verify(memberService).notify(member);
현재는 호출 순서가 맞기에 오류가 발생하지 않지만 member와 study의 호출 순서를 변경하면 아래와 같이 오류가 발생한다.
verifyNoMoreInteractions
특정 메서드 호출 후 더 이상 어떠한 이벤트가 발생하지 않는 것을 체크하고 싶을 때
InOrder inOrder = inOrder(memberService);
inOrder.verify(memberService).notify(study);
verifyNoInteractions(memberService);
스터디 공지 이후에는 어떠한 이벤트도 발생하지 않는 것을 체크하지만
현재 MemberService에는 스터디 공지 이후에 멤버들에게 공지하는 메서드가 실행되므로 오류가 발생된다.
memberService.notify(newstudy);
memberService.notify(member.get());
코드 참조
https://github.com/mike6321/PURE_JAVA/tree/master/HowToTest/inflearn-the-java-test
'Java > Test' 카테고리의 다른 글
(Test) BDD 스타일 Mockito API (0) | 2020.01.05 |
---|---|
(Test) Mock 객체 Stubbing (0) | 2020.01.05 |
(Test) Mock 객체 만들기 (0) | 2020.01.05 |
(Test) Mockito 란? (0) | 2020.01.01 |
(Test) JUit5 - JUnit4 Migration (0) | 2020.01.01 |