Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于单元测试的Spring/Hibernate Autowire非JPA存储库_Java_Spring_Hibernate_Jpa - Fatal编程技术网

Java 用于单元测试的Spring/Hibernate Autowire非JPA存储库

Java 用于单元测试的Spring/Hibernate Autowire非JPA存储库,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,我在一个SpringBoot应用程序中工作,我正在构建我的服务和存储库单元测试 我知道我可以在一个扩展JPA存储库的标准存储库中自动连线,但是对于一个带有@Repository注释的标准类,它使用@PersistentContext和执行em.createNativeQuery(query,class.)的EntityManager,getResultList 例如,我正在运行一个内存中的数据库,我可以自动连接一个标准的JpaRepository并说getOne或getAll,它将对内存中的测试

我在一个SpringBoot应用程序中工作,我正在构建我的服务和存储库单元测试

我知道我可以在一个扩展JPA存储库的标准存储库中自动连线,但是对于一个带有
@Repository
注释的标准类,它使用
@PersistentContext
和执行
em.createNativeQuery(query,class.)的
EntityManager
,getResultList

例如,我正在运行一个内存中的数据库,我可以自动连接一个标准的JpaRepository并说
getOne
getAll
,它将对内存中的测试数据库执行并返回一个结果

但是,有没有一种方法可以对我的SQL存储库执行相同的操作,并让EntityManger对测试数据库执行nativeQuery


我还没弄明白

如果您想使用spring boot对内存中的DB执行命名查询,可以使用
@DataJpaTest
注释

这很简单:

1) 在pom.xml中包含必要的依赖项

     <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <version>1.5.3.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>test</scope>
        <version>1.4.194</version>
    </dependency>
3) 自动连接存储库或实体管理器(用于测试):

4) 假设您有一个名为user的实体。创建一个并使用实体管理器查找它:

@Test
public void testNoDb() {

    User user = new User();
    user.setFirstName("First Name");
    user.setLastName("Last name");
    user.setUsername("username");
    user.setPassword("password");
    user.setEmail("user@email.com");
    this.userRepository.save(user);

    Query q = this.entityManager.getEntityManager().createQuery("SELECT u From User u WHERE u.username = :username",
            User.class);
    q.setParameter("username", "username");
    User foundUser = (User) q.getSingleResult();

    Assert.assertEquals("user@email.com", foundUser.getEmail());
}

在本例中,我使用普通查询,但您当然可以定义命名查询并使用
entityManager.createNamedQuery(…)

如果您想使用spring boot对内存中的DB执行命名查询,您可以使用
@DataJpaTest
注释

这很简单:

1) 在pom.xml中包含必要的依赖项

     <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <version>1.5.3.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>test</scope>
        <version>1.4.194</version>
    </dependency>
3) 自动连接存储库或实体管理器(用于测试):

4) 假设您有一个名为user的实体。创建一个并使用实体管理器查找它:

@Test
public void testNoDb() {

    User user = new User();
    user.setFirstName("First Name");
    user.setLastName("Last name");
    user.setUsername("username");
    user.setPassword("password");
    user.setEmail("user@email.com");
    this.userRepository.save(user);

    Query q = this.entityManager.getEntityManager().createQuery("SELECT u From User u WHERE u.username = :username",
            User.class);
    q.setParameter("username", "username");
    User foundUser = (User) q.getSingleResult();

    Assert.assertEquals("user@email.com", foundUser.getEmail());
}

在本例中,我使用普通查询,但您当然可以定义命名查询并使用
entityManager.createNamedQuery(…)

我觉得我的问题措辞不正确。但我找到了我需要的答案

我有一个非JPA存储库,如下所示:

    @Repository
    public class myRepo {
        @PersistentContext
        private EntityManager em;

        public List findMyObjects(){
           String query = <some complicated SQL query>;
           return this.em.creatNativeQuery(query, "name of a SqlResultsetMapping").getResultList();
        }
    }
@存储库
公共类myRepo{
@持久上下文
私人实体管理者;
公共列表findMyObjects(){
字符串查询=;
返回此.em.creatNativeQuery(查询,“SqlResultsetMapping的名称”).getResultList();
}
}
然后,在我的单元测试中,我有以下内容:

@RunWith(SpringRunner.class)
@SpringBootTest(properties = {"spring.jpa.hibernate.ddl-auto="})
@DataJpaTest
@Sql(<my sql files>)
public class MyRepoTest{
   @Autowired
   private EntityManager em;

   private myRepo repo;

   @Before
   public void setUp(){
      try{
         Field f1 = repo.getClass().getDeclaredField("em");
         f1.setAccessible(true);
         f1.set(repo, em);
      }
      catch(Exception e){}
   }

   @Test
   public void doMyTest(){
      repo.findMyObjects()
   }
}
@RunWith(SpringRunner.class)
@SpringBootTest(属性={“spring.jpa.hibernate.ddl auto=“}”)
@DataJpaTest
@Sql()
公共类MyRepost测试{
@自动连线
私人实体管理者;
私人myRepo回购;
@以前
公共作废设置(){
试一试{
字段f1=repo.getClass().getDeclaredField(“em”);
f1.设置可访问(真);
f1.集合(回购,em);
}
捕获(例外e){}
}
@试验
公共无效域测试(){
回购金融对象()
}
}
这就是我最终的工作。
在发表最初的文章之前,我一直在尝试Deianderi提到的方法,但是EntityManager对象没有初始化,任何东西都不起作用。也许这是因为我正在使用的这个应用程序中配置了其他东西,但我希望这对将来的其他人有所帮助

我觉得我的问题用词不对。但我找到了我需要的答案

我有一个非JPA存储库,如下所示:

    @Repository
    public class myRepo {
        @PersistentContext
        private EntityManager em;

        public List findMyObjects(){
           String query = <some complicated SQL query>;
           return this.em.creatNativeQuery(query, "name of a SqlResultsetMapping").getResultList();
        }
    }
@存储库
公共类myRepo{
@持久上下文
私人实体管理者;
公共列表findMyObjects(){
字符串查询=;
返回此.em.creatNativeQuery(查询,“SqlResultsetMapping的名称”).getResultList();
}
}
然后,在我的单元测试中,我有以下内容:

@RunWith(SpringRunner.class)
@SpringBootTest(properties = {"spring.jpa.hibernate.ddl-auto="})
@DataJpaTest
@Sql(<my sql files>)
public class MyRepoTest{
   @Autowired
   private EntityManager em;

   private myRepo repo;

   @Before
   public void setUp(){
      try{
         Field f1 = repo.getClass().getDeclaredField("em");
         f1.setAccessible(true);
         f1.set(repo, em);
      }
      catch(Exception e){}
   }

   @Test
   public void doMyTest(){
      repo.findMyObjects()
   }
}
@RunWith(SpringRunner.class)
@SpringBootTest(属性={“spring.jpa.hibernate.ddl auto=“}”)
@DataJpaTest
@Sql()
公共类MyRepost测试{
@自动连线
私人实体管理者;
私人myRepo回购;
@以前
公共作废设置(){
试一试{
字段f1=repo.getClass().getDeclaredField(“em”);
f1.设置可访问(真);
f1.集合(回购,em);
}
捕获(例外e){}
}
@试验
公共无效域测试(){
回购金融对象()
}
}
这就是我最终的工作。
在发表最初的文章之前,我一直在尝试Deianderi提到的方法,但是EntityManager对象没有初始化,任何东西都不起作用。也许这是因为我正在使用的这个应用程序中配置了其他东西,但我希望这对将来的其他人有所帮助

我不太明白你的问题。您想使用两个SQL数据库,一个用于测试,另一个用于其他目的吗?还是您已经有一个内存中的数据库,只想通过Entity manager对其执行本机查询?我不太理解您的问题。您想使用两个SQL数据库,一个用于测试,另一个用于其他目的吗?还是您已经有一个内存中的数据库,只想通过Entity manager对其执行本机查询?