繁体   English   中英

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

[英]Unit testing private methods and using mock objects

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

因为下面是我的公共方法,如果我为此编写一个单元测试用例,它将每次都影响数据库。 我想避免这种情况,因为数据库是我一直想嘲笑的外部依赖项。 使用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;           
 }

测试私有方法在很大程度上取决于类的实现。 您说对了,您可以通过其公共方法测试一个类,这是正确的。 如果您有执行很多工作的私有方法,则应将其移至其自己的类。

当您发现自己想要测试私有方法时,应该开始考虑设计。

在您的示例中,为什么读取数据库并填充对象的代码不是一个单独的类? 单一责任原则规定,一个班级应仅具有一个单一责任。 可以按照依赖倒置原则,将此新类注入到原始类中。

诸如TDD和单元测试之类的目标是提供遵循SOLID原则的解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM