[에러 일기] org.junit.jupiter.api.extension.ParameterResolutionException: No ParameterResolver registered for parameter

Turtle·2024년 8월 12일
0

에러 일기

목록 보기
2/6
post-thumbnail

👉문제 상황

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);
	}
}

0개의 댓글

관련 채용 정보