【问题标题】:How can I write a test that uses a custom JPA repository without using @SpringBootTest如何在不使用 @SpringBootTest 的情况下编写使用自定义 JPA 存储库的测试
【发布时间】:2019-12-14 22:30:34
【问题描述】:

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

  1. App 是 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 存储库的具体实例,以便我可以从 @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


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 您的 JPA 类最初是否在 datalayer.repositories 包中,即 DataLayer/src/test/java/datalayer/repositories
  • 嗨@Christian 是的,他们是。我没有移动它们。
猜你喜欢
  • 2020-08-10
  • 1970-01-01
  • 2019-05-08
  • 2019-01-26
  • 1970-01-01
  • 2021-07-28
  • 2020-04-29
  • 2013-07-21
  • 2022-10-13
相关资源
最近更新 更多