[인프런 워밍업클럽 백엔드 스터디 2기] 4주차 발자국

[인프런 워밍업클럽 백엔드 스터디 2기] 4주차 발자국

4주차 학습내용

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

강의를 학습하며 작성한 내용입니다.

MOCK을 마주하는 자세

Mockito로 Stubbing하기

테스트에 불필요한 과정을 줄이기 위해 mock을 사용해서 테스트를 한다.

메일전송같이 긴 작업 (트랜잭션에는 참여하지 않아도 되는)에는 @Transactional을 걸지 않는 게 좋다.

  • stubbing : mock 객체에 원하는 행위를 정의하는 것

Test Double

  • Stub - 상태 검증 (State Verification)

  • Mock - 행위 검증 (Behavior Verification)

순수 Mockito로 검증해보기

  • @Mock : @ExtendWith(MockitoExtension.class) 를 함께 사용해야 함.

    • verify() : mock객체에 대해 원하는 메서드가 특정 조건으로 실행되었는지 검증

  • @Spy : 한 객체에서 일부는 실제 객체를 쓰고 싶고 나머지 일부만 stubbing을 하고 싶을 때 사용

    • Mockito의 @Spy는 실제 객체를 기반으로 만들어지기 때문에 when절을 쓸 수 없다.

     

더 나은 테스트를 작성하기 위한 구체적 조언

테스트 환경의 독립성을 보장하자

@DisplayName("재고와 관련된 상품이 포함되어 있는 주문번호 리스트를 받아 주문을 생성한다.")
@Test
void createOrderWithStock() {
    // given
    Stock stock1 = Stock.create("001", 2);
    Stock stock2 = Stock.create("002", 2);
    stock1.deductQuantity(3);
    ...
    
    //when //then
    assertThatThrownBy(() -> orderService.createOrder(request, registeredDateTime))
            .isInstanceOf(IllegalArgumentException.class)
            .hasMessage("재고가 부족한 상품이 있습니다.");
}

재고가 2개인데 3개를 차감하려고 하면 차감할 수량이 없다고 테스트에 오류가 발생한다. 테스트하고자 하는 행위는 createOrder인데 재고 차감이라는 다른 행위를 끌어다쓰면서 두 가지 케이스가 혼합이 되어있기 때문에 주문 생성 자체에 대한 테스트 실패가 아니라 given절을 생성하다가 테스트를 실패하게 된다. 이런 경우 테스트가 더 복잡해지면 실패 원인을 유추하는 데 어려움이 생긴다.

  • 테스트에 독립성이 보장되지 않으면 복잡해졌을 때 실패 원인을 유추하는 데 어려움이 생긴다.

  • 테스트에서는 팩토리 메서드를 지양하는 게 좋다.

    • 팩토리 메서드도 어떤 의도를 갖기 때문에 순수한 생성자나 빌드로 given절을 구성하는 게 더 좋다.

  • 최대한 독립성을 보장해서 테스트 환경을 구성하는 것이 좋다.

테스트 독립성을 보장하자

기본적으로 테스트는 순서에 무관해야 한다. a테스트가 수행된 이후에 b테스트가 수행되어야 성공한다는 개념은 없어야 한다. 독립적으로 언제 수행되던지 같은 결과를 내야 한다.

Test Fixture

  • 테스트를 위해 원하는 상태로 고정시킨 일련의 객체

  • 공통의 fixture는 테스트의 결합도를 높여 모든 테스트에 영향을 주기 때문에 지양하는 것이 좋다.

  • builder의 parameter에는 클래스 내에서 필요한 것들만 남겨놓는 것이 좋다.

 

미션

  • 레이어 아키텍처에 대해 나만의 언어로 풀어 쓰는 미션이었는데, 강의를 듣고 공부도 했지만 막상 설명한다고 생각하고 쓰려니 헷갈리는 부분들이 생겨서 다시 공부해보면서 작성했다.

  • Mockito 관련 애노테이션의 차이점을 정리하고, 테스트코드를 적절히 배치하는 미션이었는데 배운 걸 적용한다는 느낌이 잘 드는 미션이어서 수월하게 수행한 것 같다.

 

💬 회고

하루에 들어야 하는 강의 양이 생각보다 많아서 매일매일 진도표대로 듣지는 못했지만 워밍업클럽을 통해 약간의 강제성이 생겨 들어보고 싶었던 로드맵을 빠르게 훑어볼 수 있었다. 리팩토링이나 제대로 된 테스트코드 작성은 멀게만 느껴지고 막막했는데 강의를 듣고, 미션을 수행하다보니 어떤 방향으로 공부하고 적용시켜 나가야할지 어느 정도 감이 잡힌(?) 느낌이다. 계속 공부하면서 내것으로 만들기 위해 적용하고 발저시키는 연습을 해야겠다.

댓글을 작성해보세요.

채널톡 아이콘