TotT: 목(Mock)을 과도하게 사용하지 마세요
원문: https://testing.googleblog.com/2013/05/testing-on-toilet-dont-overuse-mocks.html (Translated by Google Gemini)
코드를 테스트할 때, 코드의 의존성을 목으로 처리하여 무시하는 것이 쉬워 보일 수 있습니다.
public void testCreditCardIsCharged() {
paymentProcessor = new PaymentProcessor(mockCreditCardServer);
when(mockCreditCardServer.isServerAvailable()).thenReturn(true);
when(mockCreditCardServer.beginTransaction()).thenReturn(mockTransactionManager);
when(mockTransactionManager.getTransaction()).thenReturn(transaction);
when(mockCreditCardServer.pay(transaction, creditCard, 500)).thenReturn(mockPayment);
when(mockPayment.isOverMaxBalance()).thenReturn(false);
paymentProcessor.processPayment(creditCard, Money.dollars(500));
verify(mockCreditCardServer).pay(transaction, creditCard, 500);
}
하지만 목을 사용하지 않으면 때로는 더 간단하고 유용한 테스트를 만들 수 있습니다.
public void testCreditCardIsCharged() {
paymentProcessor = new PaymentProcessor(creditCardServer);
paymentProcessor.processPayment(creditCard, Money.dollars(500));
assertEquals(500, creditCardServer.getMostRecentCharge(creditCard));
}
목을 과도하게 사용하면 몇 가지 문제가 발생할 수 있습니다.
- 테스트를 이해하기 어려워집니다. 코드의 직접적인 사용(예: 테스트할 메서드에 값을 전달하고 반환 결과 확인) 대신, 목의 동작 방식을 알려주는 추가 코드를 포함해야 합니다. 이 추가 코드는 실제 테스트하려는 의도에서 벗어나며, 프로덕션 코드의 구현에 익숙하지 않은 경우 이 코드를 이해하기 매우 어렵습니다.
- 테스트를 유지보수하기 어려워집니다. 목에게 어떻게 동작해야 하는지 알려줄 때, 코드의 구현 세부 정보가 테스트로 유출됩니다. 프로덕션 코드의 구현 세부 정보가 변경되면, 이러한 변경 사항을 반영하기 위해 테스트를 업데이트해야 합니다. 테스트는 일반적으로 코드의 구현에 대해 거의 알지 못해야 하며, 코드의 공개 인터페이스를 테스트하는 데 집중해야 합니다.
- 코드가 제대로 작동한다는 보증이 줄어듭니다. 목에게 어떻게 동작해야 하는지 알려줄 때, 테스트에서 얻는 유일한 보증은 목이 실제 구현과 정확히 동일하게 동작할 경우에만 코드가 작동한다는 것입니다. 이는 보장하기가 매우 어려우며, 시간이 지남에 따라 코드가 변경될수록 실제 구현의 동작이 목과 동기화되지 않을 가능성이 높아져 문제가 심화됩니다.
목을 과도하게 사용하고 있다는 징후는 한두 개 이상의 클래스를 목으로 처리하거나, 목 중 하나가 한두 개 이상의 메서드 동작을 지정하는 경우입니다. 목을 사용하는 테스트를 읽으면서 테스트를 이해하기 위해 테스트 중인 코드를 머릿속으로 단계별로 실행해야 한다면, 목을 과도하게 사용하고 있을 가능성이 높습니다.
때로는 테스트에서 실제 의존성을 사용할 수 없는 경우(예: 너무 느리거나 네트워크를 통해 통신하는 경우)도 있지만, 목을 사용하는 것보다 더 나은 옵션이 있을 수 있습니다. 예를 들어, 격리된 로컬 서버(예: 테스트를 위해 특정 머신에서 시작하는 신용카드 서버) 또는 가짜 구현(예: 인메모리 신용카드 서버)이 있습니다.
격리된 서버 사용에 대한 자세한 내용은 http://googletesting.blogspot.com/2012/10/hermetic-servers.html를 참조하세요. 가짜 구현 사용에 대한 향후 Testing on the Toilet 에피소드를 기대해주세요.
Read other posts