我正在使用MongoDB Java驱动程序在我的应用程序中执行一些持久性。我的应用程序的构建是通过Maven管理的,我正在寻找将一系列与MongoDB相关的单元测试集成到我的Maven构建过程中的最佳方法。我不能假设构建应用程序的用户已将MongoDB dameon安装为服务,因此需要在执行相关单元测试之前启动守护程序。
我的第一个想法是将二进制文件存储在测试目录的resources文件夹中(例如,src / test / resources),并使用Runtime.exec()启动守护程序。有没有更清洁的方法?我觉得Runtime.exec()是一种快速而肮脏的方式来使某些东西工作但不是最理想的...我需要这个在linux和windows上工作。
我已经创建了一个包装的Maven插件 flapdoodle.de'嵌入式mongo'API:
它提供了一个 start
您可以用来启动任何版本的MongoDB的目标(例如在期间) pre-integration-test
),和 stop
将阻止MongoDB的目标(例如在期间) post-integration-test
)。
下载并存储MongoDB二进制文件 ~/.embedmongo
用于未来的构建。
我的团队有这个完全相同的问题,但我们找不到任何干净的方法来解决它。我们甚至走了一条使用ant-run插件来执行一些Ant任务(独立于操作系统)的坏道路,这些任务会在必要时启动MongoDB守护程序。我们最终废弃了一个支持AbstractMongoDbTest类的全部内容,在它的@Before方法中,断言MongoDB正在运行,如果没有,则通过一条非常具体的消息提示用户启动Mongo,从而使测试失败。它并不完美,但不幸的是,如果你在单元测试中引入外部依赖,它们不再是单元测试,它们是集成测试,要求人们拥有依赖项并不是不合理的。
其他选择:
如果所有开发人员都在同一个网络上,您可以在服务器上设置一个专用的MongoDB实例,并让测试都指向它的主机名而不是localhost(默认值)。
您还可以使用MongoDB实现抽象MongoDB与存储库模式接口之后的所有交互。无论如何,这可能是一个好主意。这将允许您的测试模拟repo接口或创建服务的存根。这将使您的单元测试不会成为集成测试。它还有一个好处,如果你决定从MongoDB转移到CouchDB甚至像Oracle这样的关系数据库,你的测试不需要改变,你只需要创建你的repo接口的新实现。
虽然@joelittlejohn使用embedmongo插件的答案会起作用。您可以直接在单元测试中使用它来进行小型控制测试。
公共课MongoDbTest {
private static MongodForTestsFactory testsFactory;
@课前
public static void setMongoDB()throws IOException {
testsFactory = MongodForTestsFactory.with(Version.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/