tod*_*ddk 11 java maven-2 mongodb
我正在使用MongoDB Java驱动程序在我的应用程序中执行一些持久性.我的应用程序的构建是通过Maven管理的,我正在寻找将一系列与MongoDB相关的单元测试集成到我的Maven构建过程中的最佳方法.我不能假设构建应用程序的用户已将MongoDB dameon安装为服务,因此需要在执行相关单元测试之前启动守护程序.
我的第一个想法是将二进制文件存储在测试目录的resources文件夹中(例如,src/test/resources),并使用Runtime.exec()启动守护程序.有没有更清洁的方法?我觉得Runtime.exec()是一种快速而肮脏的方式来使某些东西工作但不是最理想的...我需要这个在linux和windows上工作.
我创建了一个包装flapdoodle.de'嵌入式mongo'API的Maven插件:
它提供了一个start目标,您可以使用它来启动您想要的任何版本的MongoDB(例如在期间pre-integration-test),以及一个stop将停止MongoDB 的目标(例如在期间post-integration-test).
下载并存储MongoDB二进制文件以~/.embedmongo供将来构建.
我的团队也遇到了同样的问题,但我们找不到任何干净的方法来解决它。我们甚至走上了一条错误的道路,使用 ant-run 插件来执行一些 Ant 任务(独立于操作系统),这将在必要时启动 MongoDB 守护进程。我们最终放弃了整个事情,转而采用 AbstractMongoDbTest 类,该类在其 @Before 方法中断言 MongoDB 正在运行,如果没有运行,则测试失败,并显示一条非常具体的消息,提示用户启动 Mongo。它并不完美,但不幸的是,如果您向单元测试引入外部依赖项,它们就不再是单元测试,而是集成测试,要求人们提供可用的依赖项并不是不合理的。
其他选项:
如果所有开发人员都在同一网络上,您可以在服务器上设置一个专用的 MongoDB 实例,并将所有测试都指向其主机名而不是 localhost(默认)。
您还可以使用 MongoDB 实现来抽象存储库模式接口背后与 MongoDB 的所有交互。无论如何,这可能是个好主意。这将允许您的测试模拟存储库接口或创建服务存根。这将使您的单元测试不会成为集成测试。它还有一个优点是,如果您决定从 MongoDB 迁移到 CouchDB 甚至像 Oracle 这样的关系数据库,您的测试不需要更改,您只需要创建存储库接口的新实现。