使用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

回到顶部