단위 테스트
http://martinfowler.com/bliki/UnitTest.html
스프링부스트를 사용하면 test의존성에 이미 추가되어 있음
https://javadoc.io/doc/org/.mockito/mockito-core/latest/org/mockito/Mockito.html
Mock 객체 만들기
@Test시 구현체는 없지만 인터페이스 존재시 Mocking 필요
MemberService memberService = Mock(MemberService.class);
또는
@ExtendWith(MockitoExtension.class) 후에,
@Mock MemberService memberService; 또는,
테스트 메서드의 파라메터로 @Mock MemberService memberService 사용
Mock 객체 행동정의 (Stubbing)
기본행동
- Null 리턴, Optional 타입은 Optional.empty 타입
- Primitive 타입은 기본 Primitive 값
- 콜렉션은 비어있는 콜렉션
- Void 메서드는 예외를 던지지 않고 아무런 일도 발생하지 않는다.
Member member = new Member();
member.setId(1L:);
memeber.setEmail("xxx@xx.com");
when(memberService.findById(any())).thenReturn(Optional.of(member));
any() : ArgumentMatcher
http://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#3
when(리턴 타입있는 메서드)
thenThrow()
doThrow(new IlligalArgumentException()).when(memberService).validate(1L);
메소드가 동일한 매개변수로 여러번 호출될 때 각기 다르게 행동하도록 조작
http://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#10
when(memberService.FindById(any()))
.thenReturn(Optional.of(member)) // 첫 호출
.thenTrhow(new RuntimeException()) // 두 번째 호출
.thenReturn(Optional.empty()) // 세번째 호출
Mock 객체 확인
verify(memberService, times(1)).notify(study);
veify(memberService, never()).validate(any());
InOrder inOrder = inOrder(memberService);
inOrder.verify(memberService).notify(study);
inOrder.verify(memberService).notify(member);
특정 메서드가 특정 매개변수로 몇번 호출 되었는지, 최소 한번은 호출 됐는지, 전혀 호출되지 않았는지
Verifying exact number of invocations
어떤 순서대로 호출했는지
Verification in order
특정 시간 아내에 호출됐는지
Verification with timeout
특정 시점 이후에 아무 일도 벌어지지 않았는지
Finding redundant invocations
Mock BDD 스타일 API
BDD : 애플리케이션이 어떻게 행동해야 하는지에 대한 공통된 이해룰구성하는 방법
Given : 주어진 상황에서
When : 뭔가를 하면
Then : 이럴 것이다.
when -> given
given(memberService.findById(1L)).willReturn(Optionalof(member));
verify -> then
then(memberService).should(times(1)).notify(study);
https://javadoc.io/static/org.mockito/mockito-core/3.2.0/org/mockito/BDDMockito.html