我可以在 Spring Boot 中测试我的存储库而不实际将测试数据保存在数据库中吗?

Posted

技术标签:

【中文标题】我可以在 Spring Boot 中测试我的存储库而不实际将测试数据保存在数据库中吗?【英文标题】:Can I test my Repository in Spring Boot without actually saving test data in the database? 【发布时间】:2022-01-23 18:23:12 【问题描述】:

我有一个带有一些 REST 端点的 Spring Boot 应用程序和一个 MongoDB。我想创建一个在每次构建项目时运行的测试。测试应该简单地获取一些模拟数据并将其放入数据库并使用该模拟数据来测试端点是否返回正确的结果。如果可能的话,我不希望模拟数据实际上一直到数据库。我相信我以前见过 Spring 可以模拟数据库的东西。谁能指出我正确的方向?

【问题讨论】:

根据一首老歌(和电影),Grease 就是这个词。但是,在您的情况下,模拟就是这个词(例如模拟服务)。这是一个开始的地方:baeldung.com/mockito-series 您可以使用非常适合集成测试的测试容器(testcontainers.org/test_framework_integration/junit_5)。您使用的是哪个数据库,我可以发布一个示例。 @Akbar 我正在使用 MongoDB @Ben 看这个例子,它使用的是 mongodb 和测试容器。 rieckpil.de/mongodb-testcontainers-setup-for-datamongotest @Akbar 好的,我会试试的。这看起来与我正在寻找的完全一样。谢谢你:) 【参考方案1】:

这是一个使用 Spring Boot 和 @DataJpaTest 测试 JPA 查询的示例

https://reflectoring.io/spring-boot-data-jpa-test/

【讨论】:

好的,我遇到过这个问题,但是我使用的是 MongoDB 而不是 SQL,所以我不确定如何将 @DataJpaTest 与 mongo 一起使用,或者是否可能。 感谢您的反馈,但@DataJpaTest 只能在 SQL 数据库中使用 好的,还是谢谢你。【参考方案2】:

如果你想“单元”测试你的控制器 您可以使用 @WebMvcTest 并从控制器模拟您的服务调用。 在这里找到一个很好的使用 @WebMvcTest https://reflectoring.io/spring-boot-web-controller-test/

如果你真的需要做集成测试 您可以将嵌入式 mongoDb 数据库和 @SpringBootTest@DataMongoTest 注释结合使用(了解 here 如何做到这一点。 @SpringBootTest 将加载您的 applicationContext,@DataMongoTest 将自动配置您设置嵌入式 mongoDb 数据库所需的一切。

de.flapdoodle.embed.mongo 为集成测试提供嵌入式 MongoDB。所以需要添加它的依赖。

<dependency>
    <groupId>de.flapdoodle.embed</groupId>
    <artifactId>de.flapdoodle.embed.mongo</artifactId>
    <scope>test</scope>
</dependency>

如果你想预填充你的数据库,你可以在 spring 配置类中创建一个 bean

@Bean
  public Boolean preFill(MongoTemplate mongoTemplate) throws IOException 
     JSONParser parser = getJsonParser();
      List dbObjects = /* Init your objects to insert here */;

      for (Object dbObject : dbObjects) 
        Document document = new Document(parser.parseJson(JSON.serialize(dbObject)));
        mongoTemplate.insert(document, dbObject.getKey());
      
    );
    return true;
  
  
  private JSONParser getJsonParser() 
    JsonParserFactory factory= JsonParserFactory.getInstance();
    return factory.newJsonParser();
  

【讨论】:

以上是关于我可以在 Spring Boot 中测试我的存储库而不实际将测试数据保存在数据库中吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用内存数据库在 Spring Boot 中进行集成测试

在 Spring Boot 中使用嵌入式数据库进行测试

Spring Boot:在单元测试中用一个覆盖多个bean

在 Spring Boot 应用程序的 JUnit 测试中,自动装配的 JPA 存储库没有合格的 bean

Spring Boot 测试不启动上下文或加载依赖项

Spring Boot Autowired 存储库不适用于 SpringRunner 和 JPA 数据