인프런의 "더 자바, 애플리케이션을 테스트하는 다양한 방법”을 보고 정리한 것임

1. Mock 객체의 행동?

  1. Null을 리턴한다. (Optional 타입은 Optional.empty 리턴)
  2. Primitive 타입은 기본 Primitive 값.
  3. 콜렉션은 비어있는 콜렉션.
  4. Void 메소드는 예외를 던지지 않고 아무런 일도 발생하지 않는다.

2. Stubbing 이란?

  • Mock 객체의 행동을 조작하는 것

    • 특정한 매개변수를 받은 경우 특정한 값을 리턴하거나 예뢰를 던지도록 만들 수 있음
      • Mock 객체 메서드의 파라미터 값을 하드 코딩하고 싶지 않다면 Mockito의 Argument Matchers를 이용 (ex. any() 등)
    @Test
    void stubbing1Test() {
        StudyService studyService = new StudyService(memberService, studyRepository);
        assertNotNull(studyService);
    
        Member member = new Member();
        member.setId(1L);
        member.setEmail("lee@gamil.com");
    
        when(memberService.findById(any())).thenReturn(Optional.of(member));
    
        Study study = new Study(10, "java");
    
        studyService.createNewStudy(1L, study);
    }
    • Void 메소드 특정 매개변수를 받거나 호출된 경우 예외를 발생 시킬 수 있음
    
    @Test
    void stubbing2Test() {
        StudyService studyService = new StudyService(memberService, studyRepository);
        assertNotNull(studyService);
    
        Member member = new Member();
        member.setId(1L);
        member.setEmail("lee@gamil.com");
    
        when(memberService.findById(any())).thenReturn(Optional.of(member));
    
        assertEquals("lee@gamil.com", memberService.findById(1L).get().getEmail());
        assertEquals("lee@gamil.com", memberService.findById(2L).get().getEmail());
    
        doThrow(new IllegalArgumentException()).when(memberService).validate(1L);
    
        assertThrows(IllegalArgumentException.class, () -> {
           memberService.findById(1L);
        });
    
        memberService.validate(2L);
    }
    • 메소드가 동일한 매개변수로 여러번 호출될 때 각기 다르게 행동하도록 조작할 수도 있음
    @Test
    void stubbing3Test() {
        StudyService studyService = new StudyService(memberService, studyRepository);
        assertNotNull(studyService);
    
        Member member = new Member();
        member.setId(1L);
        member.setEmail("lee@gamil.com");
    
        when(memberService.findById(any()))
                .thenReturn(Optional.of(member))
                .thenThrow(new RuntimeException())
                .thenReturn(Optional.empty());
    
        Optional<Member> byId = memberService.findById(1L);
        assertEquals("lee@gamil.com", byId.get().getEmail());
    
        assertThrows(RuntimeException.class, () -> {
           memberService.findById(2L);
        });
    
        assertEquals(Optional.empty(), memberService.findById(3L));
    }

3. 연습 문제

    @Test
    void stubbing4Test() {
        StudyService studyService = new StudyService(memberService, studyRepository);
        assertNotNull(studyService);

        Member member = new Member();
        member.setId(1L);
        member.setEmail("lee@gamil.com");

        Study study = new Study(10, "테스트");

        // TODO memberService 객체에 findById 메소드를 1L 값으로 호출하면 Optional.of(member) 객체를 리턴하도록 Stubbing
        when(memberService.findById(1L)).thenReturn(Optional.of(member));
        // TODO studyRepository 객체에 save 메소드를 study 객체로 호출하면 study 객체 그대로 리턴하도록 Stubbing
        when(studyRepository.save(study)).thenReturn(study);

        studyService.createNewStudy(1L, study);

        assertNotNull(study.getOwner());
        assertEquals(member, study.getOwner());
    }
profile
고우고우~

0개의 댓글