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

miiiinju00님의 프로필 이미지
miiiinju00

작성한 질문수

Practical Testing: 실용적인 테스트 가이드

Business Layer 테스트 (1)

OrderProduct 테스트에 대해

작성

·

291

·

수정됨

1

안녕하세요 강사님

먼저 강의에 대해 너무 감사드린다는 말씀 드리고 싶습니다.

강의 내용 중 OrderProduct를 생성하는 부분의 책임이 Order에 있게 설계하는 부분에 정말 매력을 느끼고, 유사한 설계 방법들에 대해 공부하려면 어떤 키워드를 알아보면 좋을까요??

또한 이 강의를 따라 공부해서 개인적으로 진행중인 프로젝트에 적용하면서 공부하고 있는데, 딱 Order와 OrderProduct같은 관계에서 OrderProduct를 강의에서처럼 생성자가 아닌 정적 팩토리 메소드를 통해 만들어보고자 하였습니다.

하지만 여기에서 OrderProdcut의 정적 팩토리 메소드를 테스트하려면 Order가 필요하고, Order를 create하려면 또 OrderProduct가 내부에서 만들어지는 문제가 발생했습니다.
이런 경우는 어떻게 해결할 수 있을까요??

임의로 Order에 대해 mock으로 생성해서 해결하고는 있는데, 이게 일반적인 방법이 될 수 있을까요?


감사합니다!! 

답변 2

0

박우빈님의 프로필 이미지
박우빈
지식공유자

안녕하세요, miiiinju00 님!

 

강의 내용 중 OrderProduct를 생성하는 부분의 책임이 Order에 있게 설계하는 부분에 정말 매력을 느끼고, 유사한 설계 방법들에 대해 공부하려면 어떤 키워드를 알아보면 좋을까요??

위와 같은 설계 방법이 명확한 이름으로 존재하는 것은 아니지만, DDD의 애그리거트(Aggregate) 가 비슷한 개념이라고 볼 수 있겠네요. ㅎㅎ

 

또한 이 강의를 따라 공부해서 개인적으로 진행중인 프로젝트에 적용하면서 공부하고 있는데, 딱 Order와 OrderProduct같은 관계에서 OrderProduct를 강의에서처럼 생성자가 아닌 정적 팩토리 메소드를 통해 만들어보고자 하였습니다.

하지만 여기에서 OrderProdcut의 정적 팩토리 메소드를 테스트하려면 Order가 필요하고, Order를 create하려면 또 OrderProduct가 내부에서 만들어지는 문제가 발생했습니다.
이런 경우는 어떻게 해결할 수 있을까요??

임의로 Order에 대해 mock으로 생성해서 해결하고는 있는데, 이게 일반적인 방법이 될 수 있을까요?

음 코드를 주시지는 않아서 정확히는 알 수 없지만, OrderProduct의 생성이 Order 내부로 감춰진 상황에서 OrderProduct를 테스트하고자 하시는 것 같네요.
기본적으로 테스트라는 것은 테스트하려는 대상의 공개 API를 테스트할 수 밖에 없습니다. (어떤 메서드를 public이 아니라 package-private 으로 두어 테스트 코드를 작성하는 방법도 있긴 하지만 프로덕션 코드 관점에서는 부자연스럽기에 권장하지는 않습니다.)
즉, OrderProduct에 대한 public API가 없는 상황이라면 테스트도 Order에 대해 이루어지는 수밖에 없습니다.

다른 관점에서 볼 때, OrderProduct의 공개 API가 없는 상황에서 OrderProduct를 반드시 테스트하고자 하는 이유가 무엇인지 확인해 볼 필요도 있습니다. 부여된 책임이 부적절하거나, 상위 객체(Order) 쪽에서 충분히 테스트 가능한(적절한) 케이스 일 수도 있거든요.

도움이 되셨으면 좋겠네요.
감사합니다. 🙂

0

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

miiiinju00님, 테스트에 관한 궁금증을 해결해 드리겠습니다.

디자인 패턴이나 설계 방법을 공부하고자 한다면 “Domain-driven design”, “Factory pattern”, “Builder pattern”, “Test-driven development” 과 같은 키워드로 검색해 보시는 것이 도움될 것입니다.

Mock 객체를 사용하는 것은 테스트 중에 발생할 수 있는 의존성을 분리하여 테스트를 단순화하기 위한 일반적인 방법입니다. OrderProduct를 생성하기 위해 Order가 필요할 때, 실제 Order 인스턴스를 만들지 않고 Mock 객체를 생성하는 것은 이러한 경우에 매우 유용합니다.

Spring Boot에는 테스트를 지원하기 위한 다양한 유틸리티와 mock 객체를 사용할 수 있는 지원 클래스가 포함되어 있습니다. 만약 Mock 객체를 사용하는 방법에 더 익숙해지고 싶다면, Spring의 테스트에 관한 문서를 참고하시길 바랍니다. 특히 @MockBean@SpyBean 애노테이션을 사용하여 Spring 컨텍스트 내의 빈을 목킹하는 방법에 대해 알아볼 수 있습니다.

Kotlin을 사용하시고 계신다면 MockK 라이브러리를 사용하여 Kotlin 클래스를 모킹할 수 있습니다. 이와 관련해서는 Spring Framework의 Kotlin 지원 섹션을 참고하시면 좋을 것 같습니다: Kotlin 테스트.

더구나 Spring Boot를 사용하고 계시다면 spring-boot-starter-test를 의존성으로 추가하여 통합 테스트를 쉽게 설정하고 실행할 수 있습니다. spring-test 모듈을 사용하여 통합 테스트를 수행하는 방법에 대해 알아보시길 추천드립니다: 테스트 Spring 애플리케이션.

이러한 자료들을 참고하시어 테스트 케이스를 작성하고 문제를 해결하는 데 도움이 되기를 바랍니다.

miiiinju00님의 프로필 이미지
miiiinju00

작성한 질문수

질문하기