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 인스턴스의 값이 반환되는 지 확인해보자.
-
assertEquals("abc@gmail.com", memberService.findById(1L).get().getEmail());
- 그러나 만약 memberService.findById()의 값이 '1L'이 아닌 다른 값이면 stubbing한 Member 인스턴스가 반환되지 않으니 주의해야한다.
- 단, any()를 사용하게 되면 어떤 변수가 들어와도 stubbing한 Member 인스턴스를 반환할 수 있다.
- assertEquals("abc@gmail.com", memberService.findById(any()).get().getEmail());
- any() 뿐만 아니라 다양한 ArgumentMatchers 사용 가능
- https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/ArgumentMatchers.html
- studyService.createNewStudy(1L, study)를 호출하여 우리가 선언한 Member 인스턴스의 값이 반환되는 지 확인해보자.
- 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
반응형