我选择的数据库是 MongoDB。我正在编写一个数据层 API 来从客户端应用程序中抽象实现细节 - 也就是说,我本质上提供了一个公共接口(充当 IDL 的对象)。
我正在以 TDD 方式测试我的逻辑。在每次单元测试之前,@Before
调用方法来创建数据库单例,之后,当测试完成时,@After
调用方法来删除数据库。这有助于促进单元测试之间的独立性。
几乎所有单元测试,即执行上下文查询,需要事先发生某种插入逻辑。我的公共接口提供了一个插入方法 - 然而,使用此方法作为每个单元测试的先驱逻辑似乎是不正确的。
我确实需要某种模拟机制,但是,我在模拟框架方面没有太多经验,而且 Google 似乎没有返回任何可能与 MongoDB 一起使用的模拟框架。
其他人在这些情况下会做什么?也就是说,人们如何对与数据库交互的代码进行单元测试?
另外,我的公共接口连接到外部配置文件中定义的数据库 - 使用此连接进行单元测试似乎不正确 - 再次,这种情况会受益于某种模拟?
从技术上讲,与数据库(nosql 或其他)对话的测试不是单元测试 http://en.wikipedia.org/wiki/Unit_testing,因为测试正在测试与外部系统的交互,而不仅仅是测试孤立的代码单元。然而,与数据库交互的测试通常非常有用,并且通常足够快,可以与其他单元测试一起运行。
通常我有一个服务接口(例如UserService),它封装了处理数据库的所有逻辑。依赖于 UserService 的代码可以使用 UserService 的模拟版本并且易于测试。
当测试与 Mongo 通信的服务的实现时(例如 MongoUserService),最简单的方法是编写一些 java 代码来启动/停止本地计算机上的 mongo 进程,并让您的 MongoUserService 连接到该进程,请参阅此一些笔记的问题 https://stackoverflow.com/questions/5857809/configure-use-mongodb-mockup-server-for-unit-testing.
您可以在测试 MongoUserService 时尝试模拟数据库的功能,但通常这太容易出错,并且不能测试您真正想要测试的内容,即与真实数据库的交互。因此,在为 MongoUserService 编写测试时,您需要为每个测试设置一个数据库状态。看着DbUnit http://dbunit.sourceforge.net有关使用数据库执行此操作的框架的示例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)