인프런 커뮤니티 질문&답변

rlawnsdud920님의 프로필 이미지

작성한 질문수

Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트

서비스 레이어의 단위 테스트 범위 고민

작성

·

43

0

테스트 중에 고민되는 부분이 생겨서 문의드립니다.

A서비스의 a()메서드에서 B서비스의 b()메서드를 호출하고 있고, B서비스의 b()메서드에 대한 단위 테스트가 이미 완료된 상황을 예시로 들겠습니다.

이미 b()메서드에 대한 테스트는 끝났으니, A서비스 단위 테스트 시 a()가 b()를 호출해서 생기는 결과에 대해서는 따로 검증이 필요하지 않을까요?

저는 b()를 호출하는 것까지가 a()의 책임이기 때문에 a()를 테스트하려면 b() 호출에 따른 검증 과정도 필요하다고 생각됩니다.

하지만 이 경우 여러개를 의존하는 클래스에 대한 테스트 시, assertThat()과 같은 검증 코드 및 테스트 코드가 뚱뚱해지는 일이 발생합니다.

혹은 테스트 시 a()에서 B서비스의 b()를 호출했는 지에 대해 Mock라이브러리의 verified를 통해 검증 가능한 것으로 알고있는데, 모키토 같은 외부 라이브러리를 사용하지 않고 테스트를 작성하고 싶어 고민됩니다.

 

결국 A서비스를 단위 테스트할 때 어디까지 테스트하는 것이 적절한 책임 분배?인지 알고 싶습니다.

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

님께서 서비스 레이어의 단위 테스트 범위에 대한 고민을 갖고 계신 것으로 이해됩니다. 특히, 외부 서비스 호출의 경우, 해당 호출 결과까지 검증해야 하는지, 아니면 단순히 호출 자체만 검증해야 하는지에 대한 의문이셨군요.

이와 유사한 상황에 대한 인사이트를 제공하는 기존 답변을 찾았습니다. 아래는 서비스 레이어 상호 의존성에 대한 테스트 방법을 논하는 답변입니다:

  • 서비스 레이어 끼리의 의존” - 이 글에서는 서비스 레이어 간 의존성이 있는 경우의 테스트 방법에 대해 설명하고 있습니다. 김우근 강사님의 답변은 서비스 간 참조가 괜찮다는 전제 아래, 어떻게 이를 테스트하는지에 대한 인사이트를 제공합니다. 특히, 서비스 레이어에서 다른 서비스를 호출하는 경우 Mockito 같은 Mocking 라이브러리를 사용하여 의존 서비스의 행위를 명시적으로 정의하고 검증하는 방법을 설명하고 있습니다.

님의 질문과 관련하여, 서비스의 단위 테스트는 일반적으로 해당 서비스가 의도대로 작동하는지를 검증하는 것을 목표로 합니다. 외부 서비스(예: B서비스의 b() 메서드) 호출의 결과를 테스트하는 것이 아니라, 해당 외부 서비스가 적절히 호출되었는지 여부를 주로 검증합니다. 외부 서비스의 실제 로직은 해당 서비스의 단위 테스트에서 담당해야 합니다.

Mockito와 같은 라이브러리를 사용하지 않고 테스트를 작성하고자 한다면, Fake 객체나 Stub를 직접 구현하여 사용할 수 있습니다. 이 방법을 통해 외부 서비스 호출을 대체할 수 있으며, a() 메서드가 b() 메서드를 적절히 호출하는지 여부만을 검증할 수 있습니다.

읽어보시면 님의 문제해결에 도움이 될 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.