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

방경원님의 프로필 이미지

작성한 질문수

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

주문 기능 테스트

상품주문_재고수량초과() 질문

작성

·

103

·

수정됨

0

    @Test
    public void 상품주문_재고수량초과() throws Exception {
        //Given
        Member member = createMember();
        Item item = createBook("시골 JPA", 10000, 10); //이름, 가격, 재고
        int orderCount = 11; //재고보다 많은 수량
        //When
        assertThrows(NotEnoughStockException.class, () -> orderService.order(member.getId(), item.getId(), orderCount));
        //Then
        fail("재고 수량 부족 예외가 발생해야 한다.");
    }

이렇게 작성할 경우, fail()문을 넣으면 테스트오류가 뜨는데 없애는 게 맞나요, 안넣으면 오류가 안떴을 경우를 어떻게 확인하나요??

답변 2

0

안녕하세요. 방경원님, 공식 서포터즈 OMG입니다.

assertThrows()의 동작과 강의에서의 junit4(expected)의 차이로 인한 상황인데요 😀

다음 링크(클릭)의 제 답변과 링크에서 참고하고 있는 codesweaver 님의 assertThrows의 구현코드 관련 답변을 참고해주세요 ^^

오류가 안뜨는게 사실 정상입니다 😀 예외가 발생하도록 테스트를 작성하고 실제 예외가 발생한다면 테스트가 성공하는 것이기 때문에

재고 수량을 초과한 주문을 검증 -> 실제 오류가 발생하여 테스트 성공

이와 같은 시나리오로 테스트가 작성되어야 합니다.

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다. 방경원님.

JUnit에서 fail() 메소드는 테스트가 실패해야 하는 시나리오에서 실패하였는지를 명시적으로 확인하기 위해 사용됩니다. assertThrows 메소드는 특정 예외가 발생하기를 기대하는 상황에서 사용되며, 예상한 예외가 발생하면 테스트는 성공으로 간주됩니다.

방경원님께서 공유하신 코드를 보면, assertThrows를 통해 NotEnoughStockException 예외 발생을 확인하려고 하고 있습니다. 만약 예외가 정상적으로 발생하면, 이어지는 fail() 메소드는 실행되지 않아야 합니다. 그러나 fail() 메소드가 실행된다는 것은 assertThrows에서 기대한 예외가 발생하지 않았다는 의미로, 테스트가 실패해야 올바른 상황입니다.

따라서, fail("재고 수량 부족 예외가 발생해야 한다."); 구문은 assertThrows로 예외 발생을 확인한 다음 예외가 발생하지 않아 테스트가 정상적으로 수행된 경우에만 도달하므로, 이는 테스트가 실패해야 하는 조건을 확인하기 위한 것입니다. assertThrows가 성공적으로 예외를 포착한다면, fail() 메소드는 실행되지 않습니다.

이와 유사한 상황으로 기존 답변 중 이와 관련된 조언을 제공한 게시물이 있어 참고하실 수 있습니다.

이 링크에서는 JUnit5를 활용하여 assertThrows 메소드를 사용한 예외 처리 테스트에 관한 글이며, 실제로 예외를 검증하는 과정에서 fail() 메소드의 사용 방식에 대해서도 참고할 수 있습니다.

fail() 메소드의 사용 여부는 테스트의 명확성을 위해 선택할 수 있습니다. 예외가 발생하지 않고 테스트 코드가 fail() 메소드에 도달했을 때 명시적으로 실패 메시지를 보여주고자 하는 의도로 사용됩니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.

현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏

추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.