如何编写不使用@SpringBootTest

时间:2019-12-14 22:30:34

标签: java spring spring-boot jpa

我写了一个多模块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存储库连接到测试?

1 个答案:

答案 0 :(得分:0)

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

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

因此,对于注入类型的冒泡搜索从未遇到过。

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

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