无法执行 DataJpaTest
Not able to execute DataJpaTest
我有一个名为 TagRepository
的 spring-data-jpa
存储库。我的 spring-boot
版本是 2.1.2。我在运行时范围内使用 H2 依赖项,我打算将它用于应用程序和集成测试。我想为 TagRepository 写一个 DataJpaTest
。我写了下面的代码:
@RunWith(SpringRunner.class)
@EnableAutoConfiguration
@DataJpaTest
@ContextConfiguration(classes={TagRepository.class})
public class TagRepositoryTest {
@Autowired
private TestEntityManager testEntityManager;
@Autowired
private TagRepository tagRepository;
@Test
public void findByTagTest() {
Tag tag = new Tag("java");
testEntityManager.persistAndFlush(tag);
Optional<Tag> optionalTag = tagRepository.findByTag(tag.getTag());
if(!optionalTag.isPresent()) {
fail("Tag not found hence test failed");
}
assertThat(optionalTag.get()).isEqualTo(tag);
}
}
但是,当我执行测试时它说应用程序无法启动并且我收到以下错误:
Invalid bean definition with name 'tagRepository' defined in null: Cannot register bean definition [Root bean: class [org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] for bean 'tagRepository': There is already [Generic bean: class [com.upday.task.repository.TagRepository]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] bound.
The bean 'tagRepository', defined in null, could not be registered. A bean with that name has already been defined in null and overriding is disabled.
Action:
Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true
测试 class 本身驻留在与 jpa 存储库不同的包中。
只需删除
@ContextConfiguration(classes={TagRepository.class})
来自你的测试。
它用于传递自定义 @Configuration
而不是常规 bean。
UPD:
当数据 jpa 测试和被测存储库驻留在不同的包中时 spring runner 需要一点提示来从另一个地方扫描 classes。通过
指出应用程序 class
@ContextConfiguration(classes={SpringBootApplication.class})
将扩展组件扫描范围并允许测试环境获取额外的 bean。
我有一个名为 TagRepository
的 spring-data-jpa
存储库。我的 spring-boot
版本是 2.1.2。我在运行时范围内使用 H2 依赖项,我打算将它用于应用程序和集成测试。我想为 TagRepository 写一个 DataJpaTest
。我写了下面的代码:
@RunWith(SpringRunner.class)
@EnableAutoConfiguration
@DataJpaTest
@ContextConfiguration(classes={TagRepository.class})
public class TagRepositoryTest {
@Autowired
private TestEntityManager testEntityManager;
@Autowired
private TagRepository tagRepository;
@Test
public void findByTagTest() {
Tag tag = new Tag("java");
testEntityManager.persistAndFlush(tag);
Optional<Tag> optionalTag = tagRepository.findByTag(tag.getTag());
if(!optionalTag.isPresent()) {
fail("Tag not found hence test failed");
}
assertThat(optionalTag.get()).isEqualTo(tag);
}
}
但是,当我执行测试时它说应用程序无法启动并且我收到以下错误:
Invalid bean definition with name 'tagRepository' defined in null: Cannot register bean definition [Root bean: class [org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] for bean 'tagRepository': There is already [Generic bean: class [com.upday.task.repository.TagRepository]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] bound.
The bean 'tagRepository', defined in null, could not be registered. A bean with that name has already been defined in null and overriding is disabled.
Action:
Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true
测试 class 本身驻留在与 jpa 存储库不同的包中。
只需删除
@ContextConfiguration(classes={TagRepository.class})
来自你的测试。
它用于传递自定义 @Configuration
而不是常规 bean。
UPD: 当数据 jpa 测试和被测存储库驻留在不同的包中时 spring runner 需要一点提示来从另一个地方扫描 classes。通过
指出应用程序 class@ContextConfiguration(classes={SpringBootApplication.class})
将扩展组件扫描范围并允许测试环境获取额外的 bean。