inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

주문 기능 테스트

Mockito 를 사용하여 테스트할 때, 테스트 요구사항의 반영 질문

666

irostub

작성한 질문수 5

0

이번 강의의 1분 30초 쯤, 현재 작성하는 테스트 방법이 그다지 좋은 방법은 아니다라는 말을 들었습니다. 그래서 좋은 테스트 방법은 무엇인지 찾아보게 되었고 돌아돌아 Mockito 같은 테스트 프레임워크를 알게되었습니다.
 
좋은건 일단 맛은 봐야하는 성격이라, 강의를 듣다말고 Mockito 를 사용하여 단위 테스트 하는 방법 알아보는 길로 한참 새버렸습니다 ㅎㅎㅎ
 
Mockito 를 사용해서 OrderService 의 주문 성공에 대한 테스트 코드를 작성해보았습니다. 근데 영한 선생님이 강의에서 작성할 때의 assertEquals 이나 그런 요구사항들에 대해선 테스트를 못해서 제가 테스트 코드 작성을 잘못한건가 하는 생각이 들었습니다. 코드는 다음과 같이 간단하게 작성했습니다.
@ExtendWith(MockitoExtension.class)
class OrderServiceTest {

    @Mock
    MemberRepository memberRepository;

    @Mock
    ItemRepository itemRepository;

    @Mock
    OrderRepository orderRepository;

    @InjectMocks
    OrderService orderService;

    @Test
    @DisplayName("주문 성공")
    void order() {
        Member member = new Member(
                1L,
                "irostub",
                new Address("seoul", "street", "10000"),
                new ArrayList<>());
        Item item = new Book(
                1L,
                "itemName",
                15000,
                2021,
                new ArrayList<>(),
                "5pg",
                "isbn5100");

        //given
        given(memberRepository.findOne(anyLong()))
                .willReturn(member);
        given(itemRepository.findOne(anyLong()))
                .willReturn(item);

        //when
        orderService.order(1L, 1L, 100);

        //then
        ArgumentCaptor<Order> captor = ArgumentCaptor.forClass(Order.class);
        then(orderRepository).should(times(1)).save(captor.capture());
    }
}

 

코드는 위와 같습니다. 뭔가 많이 허전합니다. 강의에서 처럼 assertEqual()에 인자로 넣을 객체를 받아올 방법이 없어서 , orderRepository.save(...) 는 void를 반환하고 orderService.order(...) 은 Long 을 반환하지만 영속성 컨텍스트도 없으므로 null 을 반환합니다.
 
그래서 결국 테스트 한 것이라곤, Mock 을 통해 적당한 맴버, 상품을 정해놓고 orderService.order(...) 메서드를 실행중에 orderRepository.save(...) 을 잘 호출했는가? 뿐입니다. 이렇게 하는게 맞는걸까요..?
 
(테스트에 대한 강의가 아님에도 이런 질문을 하는게 죄송스러울 따름입니다..ㅠㅠ 근데 어디다 물어볼 곳도 없어서 심란한 마음에 글을 씁니다)

테스트 웹앱 mockito JPA spring java spring-boot

답변 2

1

김영한

안녕하세요. irostub님^^

Mockito로 테스트를 시도하신 것은 잘 하신 것입니다. 그리고 생각하신 것 처럼 각각 단위를 나누어서 테스트하는 것이 맞습니다.

앞으로는 죄송하지만 질문 안내에 있는 것 처럼 학습에 관련된 질문을 올려주시길 부탁드립니다.

저도 마음으로는 도움을 드리고 싶지만, 하루에도 수 많은 분들이 질문을 올려주십니다. 그래서 학습과 관련된 질문에 초점을 맞추는 것이 맞다 생각합니다. 다시한번 이해를 부탁드립니다.

0

irostub

학습내용과 관계되지 않은 질문을 드렸음에도 답변을 주셔서 감사합니다. 반성하겠습니다 ㅜㅜ

아, 그리고 작성 방향이, 맞는 방향인지 아닌지 알려주셔서 감사합니다!

0

irostub

쓰면서 다시 한번 생각해봤는데,

Service 계층은 통합테스트를 하고

Domain은 Mockito 를 사용해서 createOrder 등의 메서드를 단위 테스트하면 되는건가? 라는 생각도 듭니다. 

아니면 바라보는 시각이 잘못된걸까요?

OrderService 클래스의 입장에서 사실은

Order 의 주문시 상태가 ORDER 인지 아닌지,

주문한 상품 종류 수가 정확한지,

주문 가격은 가격 * 수량인지는

관심사가 아니여서 위에 질문과 같은 코드로 짜되 요구사항에 해당하는 관심사를 가진 클래스를 따로 단위테스트를 해주면 되는걸까요?

 

짜임새 있는 코드, 더 나은 코드를 짜보려고 생각하다보니 무지무지 어려워지는거같네요 ㅠㅠ

sdk 설정 오류

0

49

2

오탈자 - @Transactional

0

55

1

src/test/resources 테스트 경로 문제

0

50

1

상품 등록후 H2 db 출력 순서 바꿀 수 있나요?

0

63

1

MemberRepositoryTest 실행오류

0

81

1

boot 4.x >>> trasasction rolled back log & p6spy(영한님, 수업 자료 업데이트 해주시면 감사하겠습니다!!)

1

183

2

강의 마지막 QueryDSL 사용 부분 질문있습니다

1

137

2

클라이언트에서 isbn과 author 수정 요청을 한 경우에 대해 질문드립니다.

0

51

1

도메인 모델 패턴 vs 트랜잭션 스크립트 패턴

0

71

1

기본 생성자

0

60

1

h2 DB 연결시 jdbc url 변경 이유가 궁금합니다.

0

100

1

멤버서비스테스트 부분에서 막힙니다.

0

164

4

실무에서도 EntityManager를 이용해서 많이 작업하는 편일까요?

0

116

1

초반에 h2 다운로드 과정 꼭 필요한가요?

0

118

2

자신 필드에도 get으로 접근하는 이유가 있을까요?

0

112

1

24분 27초 연관관계 편의 메서드 위치

0

113

1

단건 주문만 가능하게 한건 의도한 부분이신가요?

0

108

2

빌드 툴, Gradle

0

59

1

h2연결은 된 것 같은데 엔티티 테이블까지 작성 후 확인해보아도 테이블이 안보입니다

0

76

2

Repository에서 EntityManager 주입 방식 차이

0

88

1

롬복과 사용자 정의 setter 메서드

0

71

1

주문 목록 조회 fetch join 질문드립니다

0

81

1

dirty checking 질문드립니다.

0

81

1

동시성 관련 질문입니다

0

74

1