package study.springdatajpa.repository;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import study.springdatajpa.domain.Member;
import java.util.List;
@DataJpaTest
class MemberRepositoryTest {
private final MemberRepository memberRepository;
MemberRepositoryTest(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Test
void testQuery() {
Member m1 = new Member("AAA", 10);
Member m2 = new Member("BBB", 20);
memberRepository.save(m1);
memberRepository.save(m2);
List<Member> result = memberRepository.findUser("AAA", 10);
Assertions.assertThat(result.get(0)).isEqualTo(m1);
}
}
21:39:24.133 [main] INFO org.springframework.test.context.support.AnnotationConfigContextLoaderUtils -- Could not detect default configuration classes for test class [study.springdatajpa.repository.MemberRepositoryTest]: MemberRepositoryTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
21:39:24.467 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper -- Found @SpringBootConfiguration study.springdatajpa.SpringdatajpaApplication for test class study.springdatajpa.repository.MemberRepositoryTest
org.junit.jupiter.api.extension.ParameterResolutionException: No ParameterResolver registered for parameter [study.springdatajpa.repository.MemberRepository arg0] in constructor [study.springdatajpa.repository.MemberRepositoryTest(study.springdatajpa.repository.MemberRepository)].
at java.base/java.util.Optional.orElseGet(Optional.java:364)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
JUnit5로 스프링 데이터 JPA 리포지토리 테스트를 수행하던 도중 위와 같은 에러를 맞닥뜨렸다.
Main 코드에서는 생성자가 하나만 존재하면 @Autowired
어노테이션 없이도 스프링 컨테이너가 알아서 생성자 주입을 하니 에러가 발생하지 않는데 위와 같은 테스트 코드 작성 시 테스트 프레임워크에서 주체는 Jupiter
이기 때문에 생성자를 통한 주입을 한다고 한들 의존성 주입을 자동으로 할 수가 없기에 발생하는 것이다. 따라서 테스트 코드 작성 시에는 @Autowired
어노테이션을 반드시 명시해주어야 한다.
package study.springdatajpa.repository;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import study.springdatajpa.domain.Member;
import java.util.List;
@DataJpaTest
class MemberRepositoryTest {
private final MemberRepository memberRepository;
@Autowired
MemberRepositoryTest(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Test
void testQuery() {
Member m1 = new Member("AAA", 10);
Member m2 = new Member("BBB", 20);
memberRepository.save(m1);
memberRepository.save(m2);
List<Member> result = memberRepository.findUser("AAA", 10);
Assertions.assertThat(result.get(0)).isEqualTo(m1);
}
}