코드
@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을 주입해주지 않아서 문제가 발생했습니다.
@RequiredArgsConstructor)를 인식해서 객체를 만들때 스프링 컨테이너에서 QuestionRepository를 찾아서 주입해줍니다.No ParameterResolver registered 에러가 뜹니다.→ 생성자 주입은 Spring의 규칙이지 JUnit이 해주지 않습니다.
@Autowired 를 붙여주자.테스트 환경에서는 생성자 주입 대신 @Autowired로 필드 주입 받아야 합니다.
그리고 테스트 클래스는 어차피 한번 쓰고 버려지기 때문에 굳이 final 을 써서 불변성을 유지하지 않고, 간편하게 @Autowired 로 스프링 컨테이너에게 빈 주입을 부탁하면 됩니다.
해결된 코드
@SpringBootTest
class Jumptosb3ApplicationTests {
@Autowired // RequiredArgsConstructor와 final을 지우고 Autowired 사용
private QuestionRepository questionRepository;
@Test
void test1() {
}
}
💡
결론: 테스트 코드에서는 RequiredArgsConstructor + final 조합으로 생성자 주입을 할 수 없다. @Autowired를 사용하자. JUnit은 생성자 주입 능력이 없다.