当前位置: 首页 > 知识库问答 >
问题:

@datajpatest中的存储库已初始化为空

郭皓
2023-03-14
package jpa.project.repo;

import org.junit.Assert;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.context.ContextConfiguration;

import jpa.project.entity.Person;

@EnableAutoConfiguration
@ContextConfiguration(classes = PersonRepo.class)
@DataJpaTest
public class PersonRepoTest {

    @Autowired
    private PersonRepo personRepoTest;

    @Test
    public void testPersonRepo() throws Exception {

        Person toSave = new Person();
        toSave.setPersonId(23);

        if (personRepoTest == null) {
            System.out.println("NULL REPO FOUND");
        }

        personRepoTest.save(toSave);

        Person getFromDb = personRepoTest.findOne(23);

        Assert.assertTrue(getFromDb.getPersonId() == 23);
    }
}

共有1个答案

曹自怡
2023-03-14

当使用像@DataJpatest这样的测试切片时,问题是Spring引导只会加载一组特定的类。请参阅Spring文档中的这一部分:

如果要测试JPA应用程序,可以使用@datajpatest。默认情况下,它将配置内存中的嵌入式数据库、扫描@Entity类并配置Spring Data JPA存储库。常规的@Component bean不会加载到ApplicationContext中。

@repository被认为是常规的@组件,因为它不是Spring Data JPA存储库(接口是)。所以,它没有加载。默认情况下只加载存储库接口,如下所示:

public interface PersonRepo extends JpaRepository<Person, Long> {
    ...
}

要解决问题,可以强制@DataJpatest加载所有@Repository类:

@DataJpaTest(includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Repository.class))

或者只将需要的@Repository类导入到测试中:

@Import(PersonRepo.class)

这里有另一个类似的问题:使用@datajpatest的Spring测试不能自动使用@repository的类(但是使用接口repository可以工作!)

 类似资料:
  • 我有带有Spring、Hibernate/JPA和Spring数据的webapp。我为一些实体创建了扩展JpaRepository的存储库,如果某些字段名简单为id(findById)或findByRole(其中Role是enum或findByActive,其中active是给定实体中的布尔字段),那么使用缺省方法如.save(T)或saveAndFlush、findAll甚至findBy都很好。

  • 我正在处理一个自动化的hashicorp保险库进程,我需要重复运行保险库操作符init命令,因为试错测试,我试图卸载保险库并再次安装,但似乎这并没有删除以前的解封密钥+根令牌,我该如何做到这一点? 我在某个地方读到,我需要删除存储“文件”路径,我已经删除了,但它不起作用(实际上我的/opt/vault/data/目录是空的),下面是我的vault.hcl文件:

  • 有人能告诉我如何初始化存储,以便它工作并返回一个有效的对象。 我的Node.js版本是8.12.0,firebase版本是5.1.1

  • 问题内容: 当我测试新插件时,不断抛出异常:java.lang.IllegalArgumentException:插件已初始化!请帮忙!这是代码: 我知道您只应该为每个插件声明一个JavaPlugin类,我认为我正在这样做。但它一直在说: 我真的需要测试此插件,看看它是否有效,任何帮助将不胜感激!谢谢! 问题答案: stacktrace清楚地指出了问题出在哪里。什么是堆栈跟踪,如何使用它来调试应用

  • 问题: > 我在Jenkins中配置了JDK、Git和maven安装路径。还在管理插件中的高级选项卡下配置了代理 我在Eclipse上有一个Java的项目,我使用EGit插件托管在一个存储库上,我正试图通过https将其连接到詹金斯 我在Jenkins中创建了一个新工作,添加了存储库URL(https://@bitbucket.org//.git),并在下一步添加了我的凭据。这就是我得到以下错误:

  • 通过证书口述的正确方法是什么?