我编写了一个多模块gradle项目,其中:
应用程序取决于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存储库自动装配到应用程序上下文中。测试?
我最终尝试了很多选择。我最终能够实现所需的功能,但是解决方案使我感到惊讶。
问题的根源似乎是我编写的DataJpaTest
不在同一包或JPA存储库接口的父包中。
因此正在冒泡地寻找要注入的类型从未遇到过。
解决方案是在我的项目中,但在名为SpringBootConfiguration
的程序包中创建一个以datalayer
注释的空类。
尽管我在编写的项目中不需要这样的程序包,并且实际上这是该项目中放置在该程序包中的唯一类,但正是该类的存在使Spring能够发现JPA存储库包datalayer.repositories
中定义的内容。