Test/Mockito

[Mokito] Mock 객체 Stubbing

메성 2021. 6. 13. 20:05
반응형

Mock 객체 Stubbing

Mock 객체의 행동이란,

  • 리턴 값이 있는 메소드는 모두 Null 을 리턴하고 있다.
    • Optional 타입인 경우 Optional.empty로 리턴
  • Primitive 타입은 모두 Primitive 값을 따르고 있다.
    • Ex. Boolean인 경우 'false' / Integer 혹은 Long인 경우 0
  • Collection의 경우 모두 비어있는 Collection을 가지고 있다.
  • Void 메소드의 경우 예외를 던지지 않고 아무 일도 발생하지 않는다.

 

Stubbing이란,

  • Mock 객체의 행동을 조작하는 것을 말한다.
  • Mock객체의 when 메소드를 활용하여 Stubbing을 진행해보자.
  • Ex. 리턴값이 있는 when 메소드 활용 1
      •  
    @Mock MemberService memberService
    memberService.findById(1L);
    
    //위 메소드를 호출할 때 아래와 같은 인스턴스를 받고 싶다면... Mock객체를 통해서 Stubbing을 하여 받을 수 있다.
    Member member = new Member();
    member.setId(1L);
    member.setEmail("abc@gmail.com");
    
    //Mock객체를 Stubbing
    Mockito.when(memberService.findById(1L)).thenReturn(Optional.of(member));​
  • Ex. 리턴값이 있는 when 메소드 활용 2(Service단 로직의 리턴값을 Stubbing을 활용하여 반환해보자.) 
    • studyService.createNewStudy(1L, study)를 호출하여 우리가 선언한 Member 인스턴스의 값이 반환되는 지 확인해보자.image
    • assertEquals("abc@gmail.com", memberService.findById(1L).get().getEmail());
    • 그러나 만약 memberService.findById()의 값이 '1L'이 아닌 다른 값이면 stubbing한 Member 인스턴스가 반환되지 않으니 주의해야한다.
    • 단, any()를 사용하게 되면 어떤 변수가 들어와도 stubbing한 Member 인스턴스를 반환할 수 있다.
 

mockito-core 3.11.1 javadoc (org.mockito)

Latest version of org.mockito:mockito-core https://javadoc.io/doc/org.mockito/mockito-core Current version 3.11.1 https://javadoc.io/doc/org.mockito/mockito-core/3.11.1 package-list path (used for javadoc generation -link option) https://javadoc.io/doc/org

javadoc.io

    • Ex. 예외를 던지는 when 메소드 활용 1
      • //Mockito.when() 활용
        when(memberService.findById(1L)).thenThrow(new RuntimeException());
        
        //Mockito.doThrow() 활용
        doThrow(new IllegalAccessError()).when(memberService).validate(1L);
        assertThrows(IllegalArgumentException.class, () -> {
          memberService.validate(1L);
        });
    • Ex. 리턴값 or 예외를 던지는 when 메소드 활용 (stubbing한 메소드를 반복 호출할 때의 순서에 따른 결과물을 다르게 나타낼 수 있음)
      • when(memberService.findById(any()))
          .thenReturn(Optional.of(member))
          .thenThrow(new RuntimeException())
          .thenReturn(Optional.empty());
        
        //thenReturn
        Optional<Member> byId = memberService.findById(1L);
        assertEquals("abc@gmail.com", byId.get().getEmail());
        
        //thenThrow
        assertThrows(RuntimeException.class, () -> {
          memberService.findById(2L);
        });
        
        //thenReturn
        assertEquals(Optional.empty(), memberService.findById(3L));

https://www.inflearn.com/course/the-java-application-test/dashboard

 

더 자바, 애플리케이션을 테스트하는 다양한 방법 - 인프런 | 강의

자바 프로그래밍 언어를 사용하고 있거나 공부하고 있는 학생 또는 개발자라면 반드시 알아야 하는 애플리케이션을 테스트하는 다양한 방법을 학습합니다., 그냥 개발자를 넘어 '더 나은 개발

www.inflearn.com

 

반응형