java - 使用 MongoDB 进行单元测试

标签 java unit-testing mongodb junit morphia

我选择的数据库是 MongoDB。我正在编写一个数据层 API 来从客户端应用程序中抽象实现细节——也就是说,我本质上是提供一个公共(public)接口(interface)(一个充当 IDL 的对象)。

我正在以 TDD 方式测试我的逻辑。在每个单元测试之前,调用一个@Before方法来创建一个数据库单例,之后,当测试完成时,调用一个@After方法来删除数据库。这有助于促进单元测试之间的独立性。

几乎所有单元测试,即执行上下文查询,都需要事先发生某种插入逻辑。我的公共(public)接口(interface)提供了一个插入方法 - 但是,将此方法用作每个单元测试的前导逻辑似乎是不正确的。

我确实需要某种模拟机制,但是,我在模拟框架方面没有太多经验,而且 Google 似乎没有返回任何可能用于 MongoDB 的模拟框架。

其他人在这些情况下会怎么做?也就是说,人们如何对与数据库交互的代码进行单元测试?

另外,我的公共(public)接口(interface)连接到在外部配置文件中定义的数据库 - 使用此连接进行单元测试似乎不正确 - 再次,这种情况会从某种模拟中受益?

最佳答案

与数据库(nosql 或其他)对话的技术测试不是 unit tests ,因为测试是测试与外部系统的交互,而不仅仅是测试一个孤立的代码单元。但是,与数据库通信的测试通常非常有用,并且通常足够快,可以与其他单元测试一起运行。

通常我有一个服务接口(interface)(例如UserService),它封装了处理数据库的所有逻辑。依赖 UserService 的代码可以使用 UserService 的模拟版本并且易于测试。

在测试与 Mongo 对话的 Service 的实现时(例如 MongoUserService),最简单的方法是编写一些 java 代码来启动/停止本地机器上的 mongo 进程,并让 MongoUserService 连接到该进程,请参阅此question for some notes .

您可以在测试 MongoUserService 时尝试模拟数据库的功能,但通常这太容易出错,并且不会测试您真正想要测试的内容,即与真实数据库的交互。因此,在为 MongoUserService 编写测试时,您需要为每个测试设置一个数据库状态。看DbUnit有关使用数据库执行此操作的框架示例。

关于java - 使用 MongoDB 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7413985/

相关文章:

unit-testing - Nunit 中的经典和约束模型断言有什么区别?

node.js - 按 Id 显示 React 属性

Java 通用高级用法

Java并发处理

typescript - 如何模拟在函数内部实例化的类 - Sinon?

Android:测试用例有没有命名规则

javascript - Mongodb:如何通过我的 api 填充我的模式中引用的模式

java - 无法使用带参数的构造函数 NO_CONSTRUCTOR 实例化 java.util.List]

java - Swing 油漆法

Java AWS 服务器 : 502 Bad Gateway nginx/1. 8.1