참고) servlet.api
- javax.servlet-api / java ee8, javax
- jakarta.servlet-api / jakarta ee9~10
-> compileOnly 'jakarta.servlet:jakarta.servlet-api:6.0.0'
HttpServletRequest 인터페이스 : 사용자 요청 데이터 조회, 처리
- String getParameter()
모의 객체를 생성한 뒤에는 BDDMockito 클래스를 이용해서 모의 객체에 스텀을 구성할 수 있다.
BDDMockito.given() 메서드를 이용하면 모의 객체의 메서드가 특정 값을 리턴하도록 설정할 수 있다.
given() 메서드에 이어 willReturn() 메서드는 스텁을 정의한 메서드가 리턴할 값을 지정한다.
모의 객체 생성
GameNumGen genMock = mock(GameNumGen.class);
-> mock(클래스클래스)
스텁 설정
given(genMock.generate(GameLevel.EASY)).willReturn("123");
-> given(특정 메서드에 매개변수가 들어오면).willReturn(이러한 값을 반환하겠다)
스텁 설정에 매칭되는 메서드 실행
String num = genMock.generate(GameLevel.EASY);
지정한 값을 리턴하는 대신에 익셉션을 발생하게 설정할 수 도 있다. 이때는 willReturn() 대신 willThrow() 메서드를 사용하면 된다.
BDDMockito.willThrow() 메서드는 발생할 익셉션 타입이나 익셉션 객체를 인자로 받는다. 이어서 given() 메서드는 모의 객체를 전달받는다. 이때는 모의 객체 메서드의 실행이 아닌 모의 객체를 만들어 주는 것 이때 given() 메서드는 인자로 전달받은 모의 객체 자신을 리턴하는데 이때 익셉션을 발생할 메서드를 호출한다.
참고) 가짜 데이터 생성 라이브러리
- 의존성 : java faker
-> implementation 'com.github.javafaker:javafaker:1.0.2'
예시) 스텁
예시) 가짜 데이터 생성 라이브러리_java faker
ㄴ 무작위 한국 이름
ㄴ 무작위 일본 이름
ㄴ 무작위 주소
GameNumGen genMock = mock(GameNumGen.class);
Game game = new Game(genMock);
game.init(GameLevel.EASY);
then(genMock).should().generate(GameLevel.EASY);
BDDMockito.then()은 메서드 호출 여부를 검증할 모의 객체를 전달받는다.
should() 메서드는 모의 객체의 메서드가 불려야 한다는 것을 설정하고 should() 메서드 다음에 실제로 불려야 할 메서드를 지정한다.
이 코드에서 genMock 모의 객체의 generate() 메서드가 GameLevel.EASY 인자를 사용해서 호출되었는지 검증한다.
정확한 값이 아니라 메서드가 불렸는지 여부가 중요하다면 any(), anyInt() 등을 사용해서 인자를 지정하면 된다.
정확하게 한 번만 호출된 것을 검증하고 싶다면 should() 메서드에 Mockito.only()를 인자로 전달한다
메서드 호출 횟수를 검증하기 위해 Mockito 클래스가 제공하는 메서드는 다음과 같다.
단위 테스트를 실행하다보면 모의 객체를 호출할 때 사용한 인자를 검증해야 할 때가 있다. String이나 int와 같은 타입은 쉽게 검증할 수 있지만 많은 속성을 가진 객체는 쉽게 검증하기 어렵다. 이럴 때 사용할 수 있는 것이 인자 캡처이다.
Mockito의 ArgumentCaptor를 사용하면 메서드 호출 여부를 검증하는 과정에서 실제 호출할 때 전달한 인자를 보관할 수 있다.
예시)