如何编写不使用@SpringBootTest的使用自定义JPA存储库的测试

问题描述 投票:0回答:1

我编写了一个多模块gradle项目,其中:

  1. 应用程序是一个SpringBootApplication。
  2. DataLayer包含JPA存储库和实体
  3. BusinessLayer包含一些业务逻辑。

应用程序取决于DataLayer和BusinessLayer。这三个之间没有其他依赖性。

一些JPA信息库是自定义的(例如,使用非琐碎的@Query注释),我想针对内存中的H2数据库对其进行测试。

我想在DataLayer / src / test / java中而不是在BusinessLayer / src / test / java中编写测试,因此我希望它们在没有@SpringBootTest注释的情况下运行。

我已经在测试类上尝试了以下注释:

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {MyConfiguration.class})

其中MyConfiguration的注释如下:

@TestConfiguration
@ComponentScan("DataLayer")

然而,Spring无法将存储库的实例注入到测试类中。

[在我需要自动装配某些bean的具体实现的其他测试中,我在MyConfiguration中提供了工厂方法,并用@Bean对其进行了注释。这使Spring可以创建那些bean并将它们注入测试中。

在这种情况下的问题是,自定义JPA存储库被定义为DataLayer中的接口,而不是具体的类。因此,我无法在MyConfiguration中提供工厂功能来创建它们。

为了将存储库自动连接,我尝试用@SpringBootTest替换@DataJpaTest,但这似乎也将太多的类引入了我的应用程序上下文。

是否有可能在代码中创建自定义JPA存储库的具体实例,以便我可以从@Bean类中的@TestConfiguration方法返回它们?

或者,如果这与Spring框架的规定背道而驰,那么推荐的一种配置此类测试的方法是,将尽可能少的类加载到应用程序上下文中,但允许Spring将自定义JPA存储库自动装配到应用程序上下文中。测试?

java spring spring-boot jpa
1个回答
0
投票

我最终尝试了很多选择。我最终能够实现所需的功能,但是解决方案使我感到惊讶。

问题的根源似乎是我编写的DataJpaTest不在同一包或JPA存储库接口的父包中。

因此正在冒泡地寻找要注入的类型从未遇到过。

解决方案是在我的项目中,但在名为SpringBootConfiguration的程序包中创建一个以datalayer注释的空类。

尽管我在编写的项目中不需要这样的程序包,并且实际上这是该项目中放置在该程序包中的唯一类,但正是该类的存在使Spring能够发现JPA存储库包datalayer.repositories中定义的内容。

© www.soinside.com 2019 - 2024. All rights reserved.