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

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

【问题讨论】:

标签: java spring spring-boot junit mockito


【解决方案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();
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    • 2010-11-29
    • 2018-12-22
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多