본문 바로가기

Java/Test

(Test) Mock 객체 확인

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

 

mike6321/PURE_JAVA

Contribute to mike6321/PURE_JAVA development by creating an account on GitHub.

github.com

 

'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