강의

멘토링

로드맵

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

woo님의 프로필 이미지
woo

작성한 질문수

더 자바, 애플리케이션을 테스트하는 다양한 방법

JUnit 5 테스트 반복하기 2부

테스트 반복하기 관련 질문입니다

작성

·

65

0

@DisplayName("파라미터 테스트")
    @ParameterizedTest(name = "{index} {displayName} message={0}")
    @ValueSource(ints = {10, 20, 40})
    void parameterizedTest(Study study){
        System.out.println(study.getLimit());
    }

Junit5 테스트 반복하기 2부에서 이 부분 질문드리려 합니다.

 

강의에서는 Study 타입으로 받아서 객체를 생성하고 getLimit으로 값 가져오는 것까지 묵시적으로 진행이 잘 되었습니다만, 제 환경에서는

```java
Error converting parameter at index 0: No built-in converter for source type java.lang.Integer and target type com.example.testpractice.Study

org.junit.jupiter.api.extension.ParameterResolutionException: Error converting parameter at index 0: No built-in converter for source type java.lang.Integer and target type com.example.testpractice.Study

at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)

at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)

at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)

at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)

at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)

at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)

at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)

at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
```

 

와 같은 에러가 발생해서 Junit이나 JDK의 버전에 따라 스펙이 바뀌었는지 궁금해져서 질문드립니다

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.
woo님, JUnit5에서 @ParameterizedTest를 사용할 때, 파라미터 타입 변환에 관한 문제를 겪고 계신 것 같습니다. 이 경우, Study 객체로 직접 변환할 수 있는 자동 변환기가 없기 때문에 발생한 오류입니다. 두 가지 해결 방법을 제안드릴 수 있습니다:

  1. Custom Converter 사용: @ConvertWith를 사용하여 명시적으로 변환기를 지정하는 방법입니다. 이를 통해 원하는 형태로 파라미터를 받을 수 있도록 합니다. 예를 들어,

    @ParameterizedTest
    @ValueSource(ints = {10, 20, 40})
    void parameterizedTest(@ConvertWith(StudyConverter.class) Study study) {
        System.out.println(study.getLimit());
    }
    

    여기서 StudyConverterSimpleArgumentConverter를 상속받아 구현해야 합니다.

  2. @MethodSource 사용: 직접 Study 객체를 생성해 리스트를 반환하는 메서드를 사용하여 파라미터를 전달할 수 있습니다.

    @ParameterizedTest
    @MethodSource("studyProvider")
    void parameterizedTest(Study study) {
        System.out.println(study.getLimit());
    }
    
    
    static Stream<Study> studyProvider() {
        return Stream.of(new Study(10), new Study(20), new Study(40));
    }
    

이 두 방법 중 하나로 파라미터 변환 문제를 해결해보시기 바랍니다. JUnit이나 JDK의 스펙 자체가 크게 변동되기 보다는, 대부분의 문제는 변환기를 선언하는 방법에서 발생하는 경우가 많습니다. 추가로, JUnit5와 JDK의 최신 버전을 사용하는지 확인해보세요.
이상이 도움이 되셨길 바랍니다!
참고: JUnit5 Parameterized Tests

woo님의 프로필 이미지
woo

작성한 질문수

질문하기