더 자바, 애플리케이션을 테스트하는 다양한 방법

Ch02. Mockito - Mock 객체 Stubbing

webmaster 2022. 1. 5. 13:23
728x90
@Test
void stubbing(
        @Mock MemberService memberService
        , @Mock StudyRepository studyRepository){
    StudyService studyService = new StudyService(memberService,studyRepository);
    assertNotNull(studyService);

    Member member = new Member();
    member.setId(1L);
    member.setEmail("xjvmdutl@gmail.com");

    //Optional<Member> member = memberService.findById(1L); //비어있는 값이 나온다.
    //memberService.validation(2L); //아무런 동작도 하지 않는다.

    //1이라는 값으로 findById(1L)을 하게 된다면 Member를 반환한다.
    //stubbing
    //파라미터를 ArgumentMatcher를 활용하면 더욱 다양하게 사용할 수가 있다.
    //리턴 타입이 있는 메소드
    //when(memberService.findById(2L)).thenReturn(Optional.of(member));
    when(memberService.findById(any())).thenReturn(Optional.of(member));
    Study study = new Study(10,"java");

    assertEquals("xjvmdutl@gmail.com",memberService.findById(1L).get().getEmail());
    assertEquals("xjvmdutl@gmail.com",memberService.findById(2L).get().getEmail());
    
    //when(memberService.findById(1L)).thenThrow(new RuntimeException()); //예외를 던지도록 할수도 있다.
    doThrow(new IllegalArgumentException()).when(memberService).validation(1L);
    assertThrows(IllegalArgumentException.class , ()->{
        memberService.validation(1L);
    });
    memberService.validation(2L);

    when(memberService.findById(any()))
            .thenReturn(Optional.of(member)) //처음 호출
            .thenThrow(new RuntimeException()) //두번째 호출
            .thenReturn(Optional.empty()); //3번쨰 호출
    Optional<Member> byId = memberService.findById(1L);
    assertEquals("xjvmdutl@gmail.com",byId.get().getEmail());

    assertThrows(RuntimeException.class , ()->{
        memberService.findById(2L);
    });
    assertEquals(Optional.empty(), memberService.findById(3L));
}

 

728x90