我选择的数据库是 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/