使用MongoDB进行单元测试
我选择的数据库是MongoDB。我正在编写一个数据层API,以从客户端应用程序中抽象实现细节-
也就是说,我实质上是在提供一个公共接口(一个充当IDL的对象)。
我正在以TDD方式测试自己的逻辑。在每个单元测试之前,@Before
调用一个方法来创建数据库单例,此后,当测试完成时,将@After
调用一个方法来删除数据库。这有助于促进单元测试之间的独立性。
几乎所有单元测试(即 执行上下文查询 )都需要先进行某种插入逻辑。我的公共接口提供了一个insert方法-
但是,将此方法用作每个单元测试的先驱逻辑似乎不正确。
确实,我需要某种模拟机制,但是,我对模拟框架没有太多的经验,而且看来Google不会返回任何可能与MongoDB一起使用的模拟框架。
在这种情况下其他人会做什么?也就是说,人们如何对与数据库交互的代码进行单元测试?
另外,我的公共接口连接到在外部配置文件中定义的数据库-再次使用此连接进行单元测试似乎不正确-再次,这种情况会从某种模拟中受益吗?
回答:
正如sbridges在这篇文章中所写的那样,不拥有专门的服务(有时也称为存储库或DAO)是一个坏主意,该服务会从逻辑中抽象出数据访问权限。然后,您可以通过提供DAO的模拟来测试逻辑。
我要做的另一种方法是创建一个Mongo对象的Mock(例如PowerMockito),然后返回适当的结果。这是因为您不必测试数据库是否可以在单元测试中工作,但是更多的时候您应该测试是否向数据库发送了正确的查询。
Mongo mongo = PowerMockito.mock(Mongo.class);DB db = PowerMockito.mock(DB.class);
DBCollection dbCollection = PowerMockito.mock(DBCollection.class);
PowerMockito.when(mongo.getDB("foo")).thenReturn(db);
PowerMockito.when(db.getCollection("bar")).thenReturn(dbCollection);
MyService svc = new MyService(mongo); // Use some kind of dependency injection
svc.getObjectById(1);
PowerMockito.verify(dbCollection).findOne(new BasicDBObject("_id", 1));
这也是一种选择。当然,模拟的创建和相应对象的返回仅作为上面的示例进行了编码。
以上是 使用MongoDB进行单元测试 的全部内容, 来源链接: utcz.com/qa/418648.html