【问题标题】:Problems with running MongoDB when JUnit tests are ran运行 JUnit 测试时运行 MongoDB 的问题
【发布时间】:2017-04-20 01:13:41
【问题描述】:

我需要 mongoDB 在我的 JUnit 测试运行时自动运行,然后在测试完成时停止。我试过使用 maven mongoDB 插件,但 mongoDB 似乎没有运行。有什么帮助吗?

【问题讨论】:

  • 您的单元测试应该首先模拟与真实数据库的通信(除非它们只是使用 JUnit 框架完成的应用程序测试......)。
  • @TimothyTruckle 如果您正在谈论模拟 mongo 驱动程序,那么请不要这样做。这是一篇关于为什么你不应该这样做的文章jaxenter.com/testing-the-database-layer-119366.html
  • 文章参数在您测试在数据库中的行为时有效。当您(unit-)在数据库之外测试业务逻辑时,您真的应该模拟数据库访问。
  • 我怀疑为什么你的UnitTest 首先应该包括测试与数据库相关的东西。即使您需要这样做,嘲笑也应该足够了。
  • @TimothyTruckle 那时你正在模拟你的存储库层,你仍然不应该模拟 db api

标签: java mongodb junit pom.xml


【解决方案1】:

您可以为此使用 embed.mongo:https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo

它基本上是在当前 jvm 中启动一个嵌入式 mongo db。

您可以使用@BeforeAll / @Before 子句启动它,然后停止它,一切都会被清理干净。

Spring Boot 内置了自动配置,因此您只需向 embed.mongo 添加一个依赖项:http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-mongo-embedded

否则你可以使用 Github 上的文档来设置你自己的嵌入式 mongo db。

【讨论】:

    【解决方案2】:

    如果您只是进行单元测试,您应该尝试模拟数据库集成。但是,我不得不一次处理这个问题,并且需要测试 Mongo/Java 项目之间的集成。 Mongo 插件也不适合我。以下是我尝试过的两个选项,也许它们会有所帮助:

    选项 1(带 Docker):在我的构建和部署堆栈(Maven、Jenkins、Docker)中,对我来说最简单的事情是启动一个 Mongo 容器作为预构建步骤,运行集成的构建环境配置设置,并关闭容器作为构建后步骤。此外,如果您有需要测试的特定数据,您可以构建一个包含该数据的容器。

    选项2(仅Maven/Mongo):在Maven的pre-integration-tests生命周期阶段,使用Maven exec plugin调用操作系统来启动Mongo。运行您的测试,并确保在 integration-test 阶段运行需要 Mongo 的测试。然后在post-integration-test 阶段关闭Mongo。根据您的测试,如果它们改变了 Mongo 实例的状态,这可能会很棘手。如果这是一个问题,您可以编写一些脚本来重新初始化/销毁 Mongo,并在上述阶段调用这些脚本。

    Maven lifecycle reference

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-08
      • 2018-12-20
      • 2023-03-13
      • 2011-11-12
      • 2013-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多