【问题标题】:@DataJpaTest not loading required classes@DataJpaTest 未加载所需的类
【发布时间】:2018-10-11 20:04:30
【问题描述】:

我正在尝试使用以下方法设置一些 Spring Boot JPA 测试:

package biz.ianw.coindatabase.test;

@RunWith(SpringRunner.class)
@DataJpaTest     
public class DbTests {
  @Test
  public void test1() { ... }
}

我有一个服务类:

package biz.ianw.coindatabase.database;

//@Service
@Repository
@Transactional(readOnly=false)
public class CoinDbService { ... }

和一个应用程序:

package biz.ianw.coindatabase;

@SpringBootApplication
@Slf4j
@Configuration
@EnableEncryptableProperties
public class Main {
  @Autowired
  CoinDbService dbService;
... }

开始测试会报错:

biz.ianw.coindatabase.Main 中的字段 dbService 需要一个“biz.ianw.coindatabase.database.CoinDbService”类型的 bean,但无法找到。

我认为这与启动期间 @DataJpaTest 加载的 bean 类型有关:

如果您想测试 JPA 应用程序,可以使用@DataJpaTest。经过 默认它会配置一个内存嵌入式数据库,扫描 @Entity 类并配置 Spring Data JPA 存储库。常规的 @Component beans 不会被加载到 ApplicationContext 中。

我不太清楚为什么 @Service 类应该被视为 JPA 测试不需要,但我试图通过将其注释为 @Repository 来强制解决问题,但无济于事。

我可以使用@Import(...) 手动加载该类,但这似乎有点棘手。有没有更好的方法告诉 DataJpaTest 我需要测试什么?

【问题讨论】:

  • @DataJpaTest 的目标是测试 JPA 自动配置、实体的映射以及您正在使用的任何 Spring Data Repositories。服务不在此范围内。如果你想要一个服务的集成测试,你需要@SpringBootTest
  • SpringBootTest 结束了整个基础设施,包括 MVC,这不是我想要的数据库测试。如果默认情况下我可以使用 DataJpaTest 测试的只是存储库,那么我正在测试 jpa,而不是我自己的代码。
  • 并非如此,您正在测试您的代码如何与 JPA 交互。您还在测试您在 spring 数据存储库中定义的任何查询方法是否执行您希望它执行的操作。您的 @Service 类(应该)处于比这更高的抽象级别,因此 Spring 不将它们视为 @DataJpaTest 范围的一部分。要自动装配您的服务,您需要完整的容器。您可能可以创建一个不加载 MVC 环境的替代应用程序类并将其用作测试的配置

标签: unit-testing spring-boot spring-data-jpa


【解决方案1】:

我引用 DataJpaTest documentation 的内容,您可以在其中找到问题的答案。

可以结合使用的注解 @RunWith(SpringRunner.class) 用于典型的 JPA 测试。可以在什么时候使用 测试只关注 JPA 组件。

使用此注解将禁用完全自动配置,取而代之的是 仅应用与 JPA 测试相关的配置。

默认情况下,使用 @DataJpaTest 注释的测试将使用嵌入的 内存数据库(替换任何显式或通常自动配置的 数据源)。 @AutoConfigureTestDatabase 注解可用于 覆盖这些设置。

如果您希望加载完整的应用程序配置,但 使用嵌入式数据库,你应该考虑结合@SpringBootTest 使用@AutoConfigureTestDatabase 而不是这个注解。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-03
    • 1970-01-01
    • 2020-01-20
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多