JUnit5: No ParameterResolver registered 에러 해결법

alice_dev·2026년 3월 16일
post-thumbnail

코드

@SpringBootTest
@RequiredArgsConstructor
class Jumptosb3ApplicationTests {

    private final QuestionRepository questionRepository;

에러


No ParameterResolver registered for parameter [final com.back.jumptosb3.QuestionRepository questionRepository] in constructor [public com.back.jumptosb3.Jumptosb3ApplicationTests(com.back.jumptosb3.QuestionRepository)].
org.junit.jupiter.api.extension.ParameterResolutionException: No ParameterResolver registered for parameter [final com.back.jumptosb3.QuestionRepository questionRepository] in constructor [public com.back.jumptosb3.Jumptosb3ApplicationTests(com.back.jumptosb3.QuestionRepository)].
	at java.base/java.util.Optional.orElseGet(Optional.java:364)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1604)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1604)

@RequiredArgsConstructor + final 조합으로 생성자를 만들어줬지만 JUnit5가 이 생성자에 bean을 주입해주지 않아서 문제가 발생했습니다.

  • 일반 스프링 빈에서는 생성자에 필요한 questionRepository를 찾아서 넣어줍니다.
    • 설명: 일반 코드에서는 스프링이 클래스를 인식하고 (ex: @Controller) 생성자 (@RequiredArgsConstructor)를 인식해서 객체를 만들때 스프링 컨테이너에서 QuestionRepository를 찾아서 주입해줍니다.
  • JUnit 테스트 클래스: 테스트를 실행하는 주체는 Spring이 아닌 JUnit입니다. JUnit은 bean을 인식을 못해서 No ParameterResolver registered 에러가 뜹니다.

→ 생성자 주입은 Spring의 규칙이지 JUnit이 해주지 않습니다.

해결: test 할때는 @Autowired 를 붙여주자.

테스트 환경에서는 생성자 주입 대신 @Autowired로 필드 주입 받아야 합니다.

그리고 테스트 클래스는 어차피 한번 쓰고 버려지기 때문에 굳이 final 을 써서 불변성을 유지하지 않고, 간편하게 @Autowired 로 스프링 컨테이너에게 빈 주입을 부탁하면 됩니다.

해결된 코드

@SpringBootTest
class Jumptosb3ApplicationTests {

    @Autowired // RequiredArgsConstructor와 final을 지우고 Autowired 사용
    private QuestionRepository questionRepository;

    @Test
    void test1() {
    }
}
💡

결론: 테스트 코드에서는 RequiredArgsConstructor + final 조합으로 생성자 주입을 할 수 없다. @Autowired를 사용하자. JUnit은 생성자 주입 능력이 없다.

0개의 댓글