问题 使用Maven启动MongoDB


我正在使用MongoDB Java驱动程序在我的应用程序中执行一些持久性。我的应用程序的构建是通过Maven管理的,我正在寻找将一系列与MongoDB相关的单元测试集成到我的Maven构建过程中的最佳方法。我不能假设构建应用程序的用户已将MongoDB dameon安装为服务,因此需要在执行相关单元测试之前启动守护程序。

我的第一个想法是将二进制文件存储在测试目录的resources文件夹中(例如,src / test / resources),并使用Runtime.exec()启动守护程序。有没有更清洁的方法?我觉得Runtime.exec()是一种快速而肮脏的方式来使某些东西工作但不是最理想的...我需要这个在linux和windows上工作。


6163
2017-07-06 15:17


起源

写一个插件:) - Pascal Thivent
@PascalThivent完成了:) github.com/joelittlejohn/embedmongo-maven-plugin - joelittlejohn


答案:


我已经创建了一个包装的Maven插件 flapdoodle.de'嵌入式mongo'API

embedmongo - Maven的插件

它提供了一个 start 您可以用来启动任何版本的MongoDB的目标(例如在期间) pre-integration-test),和 stop 将阻止MongoDB的目标(例如在期间) post-integration-test)。

下载并存储MongoDB二进制文件 ~/.embedmongo 用于未来的构建。


7
2018-06-05 21:07





我的团队有这个完全相同的问题,但我们找不到任何干净的方法来解决它。我们甚至走了一条使用ant-run插件来执行一些Ant任务(独立于操作系统)的坏道路,这些任务会在必要时启动MongoDB守护程序。我们最终废弃了一个支持AbstractMongoDbTest类的全部内容,在它的@Before方法中,断言MongoDB正在运行,如果没有,则通过一条非常具体的消息提示用户启动Mongo,从而使测试失败。它并不完美,但不幸的是,如果你在单元测试中引入外部依赖,它们不再是单元测试,它们是集成测试,要求人们拥有依赖项并不是不合理的。

其他选择:

如果所有开发人员都在同一个网络上,您可以在服务器上设置一个专用的MongoDB实例,并让测试都指向它的主机名而不是localhost(默认值)。

您还可以使用MongoDB实现抽象MongoDB与存储库模式接口之后的所有交互。无论如何,这可能是一个好主意。这将允许您的测试模拟repo接口或创建服务的存根。这将使您的单元测试不会成为集成测试。它还有一个好处,如果你决定从MongoDB转移到CouchDB甚至像Oracle这样的关系数据库,你的测试不需要改变,你只需要创建你的repo接口的新实现。


4
2018-01-21 19:58



你能详细说明为什么放弃基于蚂蚁运行的方法吗? - Laurent Pireyn
@Laurent - 如果我记得的话,我们的大多数开发人员总是在后台运行Mongo,所以编写的脚本如果有必要就开始编写它是不可靠的,无论如何都要用于边缘情况,所以我们把它扔掉了。如果Mongo没有运行,我们最终只是失败了JUnit测试设置,然后开发人员必须手动启动它,然后重新运行测试。它可能也与我们的开发人员使用windows,mac和ubuntu混合有关,我们没有一种简单的方法以独立于平台的方式启动mongo。我不记得具体细节,抱歉。 - Jesse Webb
谢谢。我处于同样的情况,因此我们决定使用锁定系统进行集中测试MongoDB,以避免混乱并发测试会话。 - Laurent Pireyn


虽然@joelittlejohn使用embedmongo插件的答案会起作用。您可以直接在单元测试中使用它来进行小型控制测试。

公共课MongoDbTest {
    private static MongodForTestsFactory testsFactory;

    @课前
    public static void setMongoDB()throws IOException {
        testsFactory = MongodForTestsFactory.with(V​​ersion.Main.PRODUCTION);
    }

    @下课以后
    public static void tearDownMongoDB()抛出异常{
        testsFactory.shutdown();
    }

    私人DB db;

    @之前
    public void setUpMongoDB()throws Exception {
        final Mongo mongo = testsFactory.newMongo();
        db = testsFactory.newDB(mongo);
    }

    @测试
    public void testDatabaseCreated(){
        assertNotNull(分贝);
    }
}

我实际上在这里记录了对此的完整解释(将它放在stackoverflow上会变得过于冗长): http://www.trajano.net/2012/06/mongodb-with-maven/


0
2018-04-13 04:56