본문 바로가기

JAVA - Backend/Plugins

Mockito

https://site.mockito.org 

 

Mockito framework site

Intro Why How More Who Links Training Why drink it? Mockito is a mocking framework that tastes really good. It lets you write beautiful tests with a clean & simple API. Mockito doesn’t give you hangover because the tests are very readable and they produce

site.mockito.org

단위 테스트

http://martinfowler.com/bliki/UnitTest.html 

 

bliki: UnitTest

Unit Tests are focused on small parts of a code-base, defined in regular programming tools, and fast. There is disagreement on whether units should be solitary or sociable.

martinfowler.com

스프링부스트를 사용하면 test의존성에 이미 추가되어 있음

https://javadoc.io/doc/org/.mockito/mockito-core/latest/org/mockito/Mockito.html 

 

Free Java Doc hosting for open source projects - javadoc.io

javadoc.io free, CDN enabled, new versions auto-detected within 24 hours Supports Java, Scala, Groovy... any language thats generates a -javadoc.jar

javadoc.io

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 

 

Mockito - mockito-core 3.3.1 javadoc

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

javadoc.io

when(리턴 타입있는 메서드)

thenThrow()

doThrow(new IlligalArgumentException()).when(memberService).validate(1L);

메소드가 동일한 매개변수로 여러번 호출될 때 각기 다르게 행동하도록 조작

http://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#10

 

Mockito - mockito-core 3.3.1 javadoc

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

javadoc.io

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

 

BDDMockito (Mockito 3.2.0 API)

Behavior Driven Development style of writing tests uses //given //when //then comments as fundamental parts of your test methods. This is exactly how we write our tests and we warmly encourage you to do so! Start learning about BDD here: http://en.wikipedi

javadoc.io

https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#BDD_behavior_verification 

 

Mockito - mockito-core 3.3.1 javadoc

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

javadoc.io