【发布时间】:2019-12-14 22:30:34
【问题描述】:
我写了一个多模块的 gradle 项目,其中:
- App 是 SpringBootApplication。
- DataLayer 包含 JPA 存储库和实体
- 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 存储库的具体实例,以便我可以从 @TestConfiguration 类中的 @Bean 方法返回它们?
或者,如果这违背了 Spring 框架的原则,那么推荐的配置此类测试的方法是,以将尽可能少的类加载到应用程序上下文中的方式,同时允许 Spring 将自定义 JPA 存储库自动装配到考试?
【问题讨论】:
-
"或者,如果这违背了 Spring 框架的原则,那么推荐的配置此类测试的方法是,以将尽可能少的类加载到应用程序上下文中并还允许 Spring 将自定义 JPA 存储库自动装配到测试中吗?" -
@DataJpaTest -
@Turing85 谢谢。我试过了,得到:“找不到 SpringBootConfiguration,你需要使用 ContextConfiguration 或 SpringBootTest(classes=...)”。可能是什么原因?
-
所以我用 SpringBootConfiguration 替换了 @TestConfiguration 注释(我不满意,因为它是一个 SpringBoot 组件),然后看到“无法检索 EnableAutoConfiguration 基础包”
-
所以我在 MyConfiguration 类上添加了注释 EnableAutoConfiguration (不带参数),然后得到:通过字段'repository'表示的不满足的依赖关系。因此,即使使用 DataJpaTest 这也不起作用。有什么想法吗?
-
它现在似乎可以工作了——在我从测试类中删除注释:@RunWith(SpringJUnit4ClassRunner.class) 之后。
标签: java spring spring-boot jpa