无法执行 DataJpaTest

Not able to execute DataJpaTest

我有一个名为 TagRepositoryspring-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。