Mockito Stubbing이란?
- 모든 Mock 객체의 행동을 조작하는 방법
//Mockito.mock() 메소드로 만드는 방법
@Test
public void mokitoTeset() {
A a = mock(A.class);
B b = mock(B.class);
C c = new C(a, b);
When(c.method1()).thenReturn(10) // 숫자 10을 리턴해야함
When(c.method2(“test”)).thenReturn(“1“) // 문자열 “1”을 리턴해야함
}
@Test
public void stubbingTest() {
Service service = mock(Service.class);
Member member = new Member();
member.setId(“testId”);
member.setEmail("abcd@naver.com");
when(memberService.findById(“testId”))
.thenReturn(Optional.of(member)) //findById가 첫번째 불렸을때 객체 리턴
.thenThrow(new RuntimeException()) //findById가 두번째 불렸을때 예외발생
.thenThrow(new RuntimeException()) //findById가 세번째 불렸을때 예외발생
.thenReturn(Optional.empty()); //findById가 네번째 불렸을때 empty 리턴
Optional<Member> byId = service.findById(“testId”); //첫번째 불렸을때
assertEquals("abcd@naver.com", byId.get().getEmail());
assertThrows(RuntimeException.class, () -> {
service.findById(“testId”); //두번째 불렸을때
});
assertThrows(RuntimeException.class, () -> {
service.findById(“testId”); //세번째 불렸을때
});
assertEquals(Optional.empty(), service.findById("testId")); //네번째 불렸을때
}
@DisplayName("BDD 스타일")
@Test
public void bddTest() {
/////// Given
Service service = mock(Service.class);
Repository repository = mock(Repository.class);
Manager manager = new StudyService(service, repository);
assertNotNull(manager);
Member member = new Member();
member.setId("testId");
member.setEmail("abcd@naver.com");
Job job = new Job(1, "search");
given(manager.findById("testId")).willReturn(Optional.of(member));
given(repository.save(job)).willReturn(job);
////// When
manager.jobSchedule(1, job);
////// Then
then(manager).should(times(1)).findById("testId"); //findById라는 메소드는 한번 실행되어야한다.
then(manager).should(times(1)).notify(job); // notify(Job) 메소드는 한번 실행되어야한다.
then(manager).should(times(1)).notify(member); //notify(Member) 메소드는 한번 실행되어야한다.
then(manager).shouldHaveNoMoreInteractions(); //manager객체로 더이상 interaction이 있으면 안됨
}