我写了一个多模块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存储库连接到测试?
答案 0 :(得分:0)
我最终尝试了很多选择。我最终能够实现所需的功能,但是解决方案使我感到惊讶。
问题的根源似乎是我编写的DataJpaTest
不在同一包中,或者不在JPA存储库接口的父包中。
因此,对于注入类型的冒泡搜索从未遇到过。
解决方案是在我的项目中但在名为SpringBootConfiguration
的程序包中创建一个带有datalayer
注释的空类。
尽管我在编写的项目中不需要这样的软件包,并且实际上这是该项目中唯一放置在此软件包中的类,但正是该类的存在使Spring能够发现JPA软件包datalayer.repositories
中定义的存储库。