2013-08-21 53 views
0

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

由于下面是我的公开方法,如果我写一个单元测试用例,它会每次都碰到数据库。我想避免这种情况,因为数据库是我一直想要模拟的外部依赖项。使用数据库的另一个问题是假设我正在对单元测试用例中的sysid进行硬编码,直到系统数据库存在于db中时才起作用。从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;   
} 
+0

嗯,首先要注意的是,不测试私有方法是好的,礼貌地说,hooey。你测试你需要测试的东西。我的一般方法是将需要测试的方法公开为'protected',然后创建一个子类来访问这些方法。 –

回答

4

测试私有方法在很大程度上取决于类的实现。你说对了,你通过公共的方法来测试一个班级是正确的。如果你有一个私人方法做了很多工作,你应该把它移到它自己的类中。

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

在你的例子中,为什么不读取数据库和填充你的对象一个单独的类的代码?单一责任原则规定,一个班级应该只有一个单一的责任。这个新类可以注入原始类,因此遵循依赖倒置原则。

像TDD和单元测试这样的事情的目标是达成遵循SOLID原则的解决方案。

+0

请将您的代码添加到问题中。这样它不可读。在处理外部依赖时,应该看看模拟和依赖注入。我写了一篇关于它的文章,你可以在http://wouterdekort.blogspot.nl/2012/03/unit-testing-hell-or-heaven.html –

+0

找到你好Wouter添加了你的帮助表示赞赏的代码。 –