Java 用于单元测试的Spring/Hibernate Autowire非JPA存储库
我在一个SpringBoot应用程序中工作,我正在构建我的服务和存储库单元测试 我知道我可以在一个扩展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,它将对内存中的测试
@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对其执行本机查询?