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

YunJeong님의 프로필 이미지

작성한 질문수

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

외부 연동을 다루는 방법

CertificationService의 테스트에서 FakerMailSender를 이용하는 부분에서 질문이 있습니다.

24.06.03 16:21 작성

·

204

·

수정됨

0

해당 방식은 FakerMailSender에 결국 테스트 의존성이생기게 된다고 생각하는데요.

현재 코드는 단순해서 개발자가 테스트 코드 수정시 확인할 부분이 없지만, 추후 객체의 구조가 변경되거나, 규칙이 추가 - 변경된다면 모든 테스트 코드의 요구사항에 맞도록 Faker객체의 구현 내용도 함께 변경되어야 할것같습니다. 하지만 항상 모든 테스트의 요구사항을 알기는 쉽지만은 않을것같은데요.

이러한 불편함을 극복하기 위한 방법이 있을까요?

답변 1

0

인프런 AI 인턴님의 프로필 이미지

2024. 06. 04. 16:26

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

YunJeong님, 질문하신 부분에 대해 답변 드립니다.

테스트 중에 특정 객체를 대체하기 위해 FakerMailSender와 같은 가짜 객체(faker 또는 mock 객체)를 사용하는 경우, 실제 구현의 변경에 따라 가짜 객체도 계속 업데이트 해야 하는 문제가 있습니다. 이러한 문제를 최소화하기 위한 방법으로는 몇 가지 접근 방법이 있습니다.

  1. 인터페이스를 사용한 결합도 낮추기: 실제 MailSenderFakerMailSender가 동일한 인터페이스를 구현하도록 설계함으로써, 객체의 구조가 변경되었을 때 인터페이스를 구현하는 방식으로만 변경을 지원하게 함으로써, 결합도를 낮추고 변경 관리를 쉽게 할 수 있습니다.

  2. 테스트 코드의 유지보수성 확보: 테스트 코드는 가능한 한 간단하고 명확하게 작성하여, 변경이 발생했을 때 쉽게 수정할 수 있도록 합니다. 테스트가 특정 구현에 의존하지 않는 방식을 선택하는 것이 중요합니다.

  3. @MockBean을 이용한 스프링 부트 테스트 지원 활용: 스프링 부트는 테스트에 유용한 몇 가지 애너테이션을 제공하는데, @MockBean을 사용하여 어플리케이션 컨텍스트에서 요구하는 빈을 목킹할 수 있습니다. 이 방법을 사용하면 실제 구현이 변경되더라도 테스트 코드에는 영향을 미치지 않으며, 손쉽게 의존성을 관리할 수 있습니다.

  4. 통합 테스트와 단위 테스트 분리: 가능한 한 통합 테스트와 단위 테스트를 명확히 분리하고, 단위 테스트에서는 실제 인프라스트럭처와의 상호작용을 최소화합니다. 이렇게 함으로써, 대부분의 로직을 단위 테스트로 검증하고, 실제 객체와의 상호작용은 통합 테스트에서만 수행하여 테스트의 복잡성을 관리할 수 있습니다.

어떤 방법을 선택하든 중요한 것은, 테스트가 어플리케이션 코드의 유지보수성을 저해하지 않고, 오히려 개발 프로세스를 지원하도록 하는 것입니다.

참고하셨으면 좋겠습니다.

YunJeong님의 프로필 이미지

작성한 질문수

질문하기