5장 메일 테스트 시 임의로 주입한 객체가 별다른 동작을 하지 않을 경우를 생각해보자.
처음 이 코드를 보면 NPE를 피하는 것 외에 어떤 목적이 있나 의문이 들 수 있는데 이전에 공부했던 내용을 요약해 보았다.
테스트 더블
실제 객체를 대신할 수 있는 객체를 의미하며 이를 여러 단계로 구분한다.
Dummy : NPE를 막기 위해 생성한 빈 객체
Stub : 호출할 때마다 매번 같은 객체를 반환하며 로직이 없음
Spy
테스트 대상 메서드가 정상으로 호출되었는지, 호출 여부를 기록하여 유효성을 검증
호출 순서를 기억하는 객체이며, 접근 불가능한 내부 정보를 테스트하기 위해서 사용 가능
Fake : Stub이 약간 발전한 형태로, 하드코딩된 로직이 포함되어 있음
Mock
실제 동작 및 행위가 실제로 발생했는지 검증하기 위한 대역
실제 로직을 수행하는 것이 제품을 만드는 것과 거의 비슷하거나 더한 노력이 필요할 수 있음
처음 테스트 더블을 접하고 Stub이 정해진 값이 나오는 경우, 과연 이 테스트가 의미가 있는지 의문이 들었는데 일반적으로 의존하는 레이어를 모방하기 위해서 테스트 더블을 사용한다고 보면 될 것 같다.
구현하는 입장에서는 의존하는 하위 레이어의 구현이나 동작 방식에 관심을 가질 필요가 없다. 이전에 봤던 원칙들에 위배되는 행위이기 때문이다. 하위 레이어는 이미 구현이 된 것 처럼 제공하고 상위 레벨에서의 로직 검증에 집중할 수 있도록 도와주기 때문에 테스트 더블이 의미가 있지 않나 생각한다.
Mockito
Mockito는 특정 클래스 타입을 제공하면 이를 기반으로 Mock 객체를 생성하며, 별도의 설정이 없다면 org.mockito.internal.creation.cglib.CglibMockMaker를 통해서 새로운 객체가 생성되고 이 객체가 어떤 콜을 하면 어떤 결과를 내거나 예외를 발생할 수 있도록 할 수 있다. Mockito의 아주 기초적인 사용 방법은 다음과 같다.
private QuestionRepository questionRepository = Mockito.mock(QuestionRepository.class);
@Before
void setup() {
Question question = new Question();
question.setTitle("Hello, Question :)");
question.setContent("Lorem ipsum dolor sit amet, consectetur adipiscing elit ... ");
BDDMockito.given(questionRepository.findAvailableQuestionById(1L)).willReturn(question);
}
5장 메일 테스트 시 임의로 주입한 객체가 별다른 동작을 하지 않을 경우를 생각해보자. 처음 이 코드를 보면 NPE를 피하는 것 외에 어떤 목적이 있나 의문이 들 수 있는데 이전에 공부했던 내용을 요약해 보았다.
테스트 더블
실제 객체를 대신할 수 있는 객체를 의미하며 이를 여러 단계로 구분한다.
Dummy : NPE를 막기 위해 생성한 빈 객체
Stub : 호출할 때마다 매번 같은 객체를 반환하며 로직이 없음
Spy
Fake : Stub이 약간 발전한 형태로, 하드코딩된 로직이 포함되어 있음
Mock
처음 테스트 더블을 접하고 Stub이 정해진 값이 나오는 경우, 과연 이 테스트가 의미가 있는지 의문이 들었는데 일반적으로 의존하는 레이어를 모방하기 위해서 테스트 더블을 사용한다고 보면 될 것 같다.
구현하는 입장에서는 의존하는 하위 레이어의 구현이나 동작 방식에 관심을 가질 필요가 없다. 이전에 봤던 원칙들에 위배되는 행위이기 때문이다. 하위 레이어는 이미 구현이 된 것 처럼 제공하고 상위 레벨에서의 로직 검증에 집중할 수 있도록 도와주기 때문에 테스트 더블이 의미가 있지 않나 생각한다.
Mockito
Mockito
는 특정 클래스 타입을 제공하면 이를 기반으로 Mock 객체를 생성하며, 별도의 설정이 없다면org.mockito.internal.creation.cglib.CglibMockMaker
를 통해서 새로운 객체가 생성되고 이 객체가 어떤 콜을 하면 어떤 결과를 내거나 예외를 발생할 수 있도록 할 수 있다.Mockito
의 아주 기초적인 사용 방법은 다음과 같다.