참고)
servlet.api
-javax.servlet-api / java ee 8, javax
-jakarta.servlet-api / jakarta ee9~10
의존성
1) mockito-core
2) mockito-junit-jupiter
모의 객체 생성
1) Mockito.mock() 메서드를 이용하면 특정 타입의 모의 객체를 생성할 수 있다.
스텁 설정
1) 모의 객체를 생성한 뒤에는 BDDMockito 클래스를 이용해서 모의 객체에 스텀을 구성할 수 있다.
2) BDDMockito.given() 메서드를 이용하면 모의 객체의 메서드가 특정 값을 리턴하도록 설정할 수 있다.
3) given() 메서드에 이어 willReturn() 메서드는 스텁을 정의한 메서드가 리턴할 값을 지정한다.
모의 객체 생성
GameNumGen genMock = mock(GameNumGen.class);
스텁 설정
// service에서
public void process(HttpServletRequest request) {
// 아이디 : email, 비밀번호 : password
String email = request.getParameter("email");
String password = request.getParameter("password");
...
}
// test에서
given(request.getParameter("email")).willReturn("test01@test.org");
given(request.getParameter("password")).willReturn("1234");
4) 지정한 값을 리턴하는 대신에 익셉션을 발생하게 설정할 수 도 있다. 이때는 willReturn() 대신 willThrow() 메서드를 사용하면 된다.
5) BDDMockito.willThrow() 메서드는 발생할 익셉션 타입이나 익셉션 객체를 인자로 받는다. 이어서 given() 메서드는 모의 객체를 전달받는다. 이때는 모의 객체 메서드의 실행이 아닌 모의 객체를 만들어 주는 것 이때 given() 메서드는 인자로 전달받은 모의 객체 자신을 리턴하는데 이때 익셉션을 발생할 메서드를 호출한다.
참고)
가짜 데이터 생성 라이브러리
java faker
implementation 'com.github.javafaker:javafaker:1.0.2'
-> testImplementation 으로 변경해도 댐
then(genMock).should().generate(GameLevel.EASY);
1) BDDMockito.then()은 메서드 호출 여부를 검증할 모의 객체를 전달받는다.
2) should() 메서드는 모의 객체의 메서드가 불려야 한다는 것을 설정하고 should() 메서드 다음에 실제로 불려야 할 메서드를 지정한다.
3) 이 코드에서 genMock 모의 객체의 generate() 메서드가 GameLevel.EASY 인자를 사용해서 호출되었는지 검증한다.
4) 정확한 값이 아니라 메서드가 불렸는지 여부가 중요하다면 any(), anyInt() 등을 사용해서 인자를 지정하면 된다.
then(genMock).should().generate(any());
5) 정확하게 한 번만 호출된 것을 검증하고 싶다면 should() 메서드에 Mockito.only()를 인자로 전달한다
then(genMock).should(only()).generate(any());
6) 메서드 호출 횟수를 검증하기 위해 Mockito 클래스가 제공하는 메서드는 다음과 같다.
2) Mockito의 ArgumentCaptor를 사용하면 메서드 호출 여부를 검증하는 과정에서 실제 호출할 때 전달한 인자를 보관할 수 있다.