study-toby-spring / dongheon.shin

MIT License
0 stars 0 forks source link

Test Double #4

Open XDXO opened 7 years ago

XDXO commented 7 years ago

5장 메일 테스트 시 임의로 주입한 객체가 별다른 동작을 하지 않을 경우를 생각해보자. 처음 이 코드를 보면 NPE를 피하는 것 외에 어떤 목적이 있나 의문이 들 수 있는데 이전에 공부했던 내용을 요약해 보았다.

테스트 더블

실제 객체를 대신할 수 있는 객체를 의미하며 이를 여러 단계로 구분한다.

처음 테스트 더블을 접하고 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);
}