[英]Why is my Spring Boot autowired JPA Repository failing JUnit test?
[英]Why does running this Spring Data JPA Repository test with JUnit 5 cause a ParameterResolutionException?
我知道 JUnit 5 在幕后引入了实质性的变化,但是这不是应该自动配置的吗?
构建.gradle:
plugins {
id 'org.springframework.boot' version '2.2.2.RELEASE'
id 'io.spring.dependency-management' version '1.0.8.RELEASE'
id 'java'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
compile 'org.imgscalr:imgscalr-lib:4.2'
runtimeOnly 'com.h2database:h2'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
test {
useJUnitPlatform()
}
存储库,位于 src/main/java/com/example/repositories:
import org.adventure.entities.Classified;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface ClassifiedRepository extends CrudRepository<Classified, Long> {}
测试,位于 src/test/java/com/example/repositories:
import org.adventure.entities.Classified;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager;
import java.util.Optional;
import static org.junit.jupiter.api.Assertions.assertTrue;
@DataJpaTest
public class ClassifiedRepositoryTest {
private TestEntityManager entityManager;
private ClassifiedRepository classifiedRepository;
public ClassifiedRepositoryTest(TestEntityManager entityManager, ClassifiedRepository classifiedRepository) {
this.entityManager = entityManager;
this.classifiedRepository = classifiedRepository;
}
@Test
public void classifiedCanBeFoundById() {
// GIVEN
Classified classified = new Classified("Cheap bike",
"Worn bike, used on a hobby level. Needs oiling", 300, "EUR");
entityManager.persist(classified);
entityManager.flush();
// WHEN
Optional<Classified> found = classifiedRepository.findById(classified.getId());
// THEN
assertTrue(found.isPresent());
}
}
结果:太长无法在此处发布,请参阅此处
在 github ( https://github.com/spring-projects/spring-framework/issues/22286 ) 上对此问题进行了长时间的讨论。 您有三个选择:
@Autowired
。 默认情况下,Spring 不会在测试类的构造函数中进行依赖注入。 你必须提到它。 @Autowired
public ClassifiedRepositoryTest(TestEntityManager entityManager, ClassifiedRepository classifiedRepository) {
this.entityManager = entityManager;
this.classifiedRepository = classifiedRepository;
}
@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL)
。 @TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL)
@DataJpaTest
public class ClassifiedRepositoryTest { ... }
@Autowired
注释您的字段。@Autowired
private TestEntityManager entityManager;
@Autowired
private ClassifiedRepository classifiedRepository;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.