单元测试私有方法并使用mock对象

本文关键字:mock 对象 有方法 单元测试 | 更新日期: 2023-09-27 18:28:30

互联网上充斥着这样的页面:我们不应该为私有方法编写单元测试用例。但我不确定说我们应该完全忽略单元测试用例的私有方法是正确的吗?我知道,如果我们测试主要的公共方法,它们最终会被测试。但是想象一下,我的方法,它访问数据库并从数据集中填充对象,包含在一个私有方法中。如果我想为我的数据库使用mock,我必须为这个方法编写一个单元测试用例,这将迫使我公开它。我该如何克服这种情况?

由于下面是我的公共方法,如果我为此编写一个单元测试用例,它每次都会进入数据库。我想避免这种情况,因为数据库是一个外部依赖,我总是想嘲笑它。使用DB的另一个问题是,假设我正在从我的单元测试用例中硬编码一个sysid,它将一直工作到sysid存在于DB中。当该记录从数据库中删除时,测试用例将变得毫无用处。

public Order RetrieveOrderAndOrderItem()
{
   DataSet ordersDS = new DataSet();
   Order obj = new Order();
   OrdersDb.RetrieveOrders(conKey,companySysId,userSysId,orderId,ordersDS);
   obj = populateObjFromDb(ordersDS,orderItemId, orderItemSubType);
   return obj;
}
 private Order populateObjFromDb(DataSet orders,int orderItemId, int orderItemSubType)
 {
    Order orderObj = new Order();
    orderObj.OrderId = Converters.DBInt(orders.Tables[0].Rows[0]["OrderId"]);
    return orderObj;           
 }

单元测试私有方法并使用mock对象

测试私有方法过于依赖于类的实现。你说你通过一个类的公共方法测试它是对的。如果你有一个做大量工作的私有方法,你应该把它移到它自己的类中。

当你发现自己处于想要测试私人方法的情况下时,你应该开始考虑你的设计。

在您的示例中,为什么读取数据库和填充对象的代码不是一个单独的类?单一责任原则规定一个类应该只有一个单一责任。这个新类可以注入到原来的类中,从而遵循依赖反转原则。

TDD和单元测试的目标是找到一个遵循SOLID原则的解决方案。