강의

멘토링

로드맵

Inflearn brand logo image

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

shsf님의 프로필 이미지
shsf

작성한 질문수

쥬쥬와 함께 하루만에 끝내는 스프링 테스트

JaCoCo void 메서드 처리와 관련하여 문의드립니다.

작성

·

60

0

강사님 안녕하세요 :) 

 

JaCoCo 설정 후 ‘라인 커버리지가 100%일 때 브랜치 커버리지가 100%가 아닌 경우’를 테스트 중입니다.

 

void 반환 타입의 경우, 메서드 종료를 위해 컴파일러가 메서드 마지막에 return;을 추가하는 것으로 이해하고 있습니다. 이때 JaCoCo 코드 커버리지 리포트 내 라인이 5줄(#1~5)이 아닌 6줄(#1~6)로 인식되는 것은 컴파일러가 return;을 추가한 후 테스트 실행 시 바이트 코드 내 RETURN이 2번 Hit되었기 때문인지요?


@NoArgsConstructor
public class NumberClassifier {

    public static void classifyNumber(int num) {
        System.out.println("num = " + num); // #1

        if (num > 0) { // #2
            System.out.println("Positive"); // #3
        } else if (num < 0){ // #4
            System.out.println("Negative"); // #5
        }
    } // #6
}

public class NumberClassifierTest {

    @DisplayName("")
    @Test
    void classifyNumber() {
        NumberClassifier.classifyNumber(1);
        NumberClassifier.classifyNumber(-1);
    }
}

 

Hits 2.png

 

image.png

 

NumberClassifier.java.png


답변 1

0

안녕하세요, 인프런 AI 인턴입니다.
shsf님께서 문의하신 JaCoCo의 void 메서드와 관련된 코드 커버리지 측정에 대해 답변드리겠습니다.

JaCoCo에서 void 메서드를 테스트할 때, 컴파일러는 메서드의 끝에 return;을 자동으로 추가합니다. 이 덕분에 Java 바이트코드에는 메서드 종료를 의미하는 RETURN 명령어가 추가됩니다.

실제 사용하신 NumberClassifier 클래스의 classifyNumber 메서드는 첫 번째 if-else 블록의 구조 외에도, 메서드 종료 시점에 임의의 return 명령어 때문에 총 6줄로 인식됩니다. 이 경우, 두 가지 호출 경로 (즉, 양수일 때와 음수일 때 각각의 조건 경로)를 통해 메서드가 두 번 호출되면서 RETURN 명령어가 두 번 실행되어 이러한 결과를 야기합니다.

즉, JaCoCo 리포트에서 확인된 라인 실행 횟수는 이러한 내부 동작의 결과로 설명될 수 있습니다. 따라서, 라인 커버리지는 모두 커버되었으나, 조건 경로(브랜치)가 완벽히 테스트되지 않은 경우(100% 라인 커버리지에 100% 브랜치 커버리지가 아닌 경우)에는 음수와 양수의 경로 외에 추가 테스트 케이스, 예를 들어 0과 같은 경계를 테스트할 필요가 있습니다.

추가 질문이 있다면 언제든지 문의해 주세요! 💡

  • 문서 링크 (해당 문서는 JaCoCo 내용과는 직접적인 관련은 없으나, 스프링 부트 테스트 지원에 대한 정보입니다.)
shsf님의 프로필 이미지
shsf

작성한 질문수

질문하기