前言:

在博客开始之前,我们先讨论一下是否应该对private方法做测试,通常有两种观点:

  1. private方法应该被测试;
  2. private方法不应该被测试;

我们以下面的代码为例子来进行说明:

public class Salary
{
public int Calcuate(int bs, int nwd)
{
int ts; if(IsValidNwd(nwd))
{
ts = bs * nwd;
}
else
{
ts = 1000;
} return ts;
} private bool IsValidNwd(int nwd)
{
if(nwd > 8)
{
return true;
}
else
{
return false;
}
}
}

这个被测试类中包含两个方法:

  1. IsValidNwd是一个private方法,当nwd大于8时返回true,否则返回false;
  2. Calcuate方法是一个public方法,包含两个输入参数。Calculate方法中第一步使用IsValidNwd方法检查nwd是否合法,如果nwd合法,则使用基本工资*工作天数。如果nwd不合法,则返回一个固定值1000.

观点1: private方法不应该被单独测试,这是因为public方法中会使用到这些私有方法当我们测试public方法时,private方法的行为会被一并测试掉。

观点2: 要对private方法进行单独的测试。

如何对private方法做单元测试

有两种方式可以对private方法做单元测试,

  1. 使用Refection --- 比较复杂;
  2. 使用VSTS PrivateObject类;

下面的示例中使用PrivateObject类来完成,

  1. 可以直接创建一个MS Unit Test工程,或者新建一个类库工程,添加Microsoft.VisualStudio.QualityTools.UnitTestFramework引用,
  2. 添加Microsoft.VisualStudio.TestTools.UnitTesting名称空间
[TestClass]
public class SalaryFunctionalTesting
{
[TestMethod]
public void IsValidNwd_ValidInput_ReturnTrue()
{
PrivateObject obj = new PrivateObject(typeof(Salary)); bool result = Convert.ToBoolean(obj.Invoke("IsValidNwd",9)); Assert.AreEqual(true, result);
} [TestMethod]
public void IsValidNwd_InValidInput_ReturnFalse()
{
PrivateObject obj = new PrivateObject(typeof(Salary)); bool result = Convert.ToBoolean(obj.Invoke("IsValidNwd", 6)); Assert.AreEqual(false, result);
}
}

上述代码中,执行了如下任务:

  1. 创建PrivateObject对象,将Salary类型做为参数传递给PrivateObject的构造函数;
  2. 使用Invoke方法调用和执行被测试类中私有方法;

感谢您的阅读~

最新文章

  1. ReactNative 适合初学的第一个教程demo,找租房
  2. C++: DataGridView::DataSource
  3. JAVA插入sql代码
  4. vc++6.0各种报错合集(附:VC++6.0调出打印窗口的方法)
  5. C#中如何排除/过滤/清空/删除掉字符串数组中的空字符串
  6. 发布的时候Archive灰色
  7. (转)RabbitMQ消息队列(二):”Hello, World“
  8. 属性声明(property declarations), 自定义属性,自动生成 get 和 set 方法,getter 和 setter
  9. U - 神、上帝以及老天爷(第二季水)
  10. Error copying image in the datastore: Not allowed to copy image file
  11. mysql各版本区别
  12. 【Android Developers Training】 78. 序言:执行网络操作
  13. [O]SQL SERVER下有序GUID和无序GUID作为主键&聚集索引的性能表现
  14. bzoj 2727: [HNOI2012]双十字
  15. Key-Value Store Indexer(Lily HBase Indexer) 小型采坑
  16. window django-https 证书
  17. centos密码策略
  18. Windows IIS注册asp 此操作系统版本不支持此选项 错误解决方法
  19. Language Oriented Programming:下一代编程样式 Part I (翻译)
  20. SSM三层模型之间的参数传递

热门文章

  1. kafka搭建
  2. weex入门篇
  3. centos 6.5 下 安装 git
  4. iPhone应用提交流程:如何将App程序发布到App Store
  5. NPOI-Excel系列-1000.创建一个标准的Excel文件
  6. (转)TreeSet简单介绍与使用方法
  7. yaml语言教程
  8. PHP外部调用网站百度统计数据的方法详解
  9. 北京师范大学第十六届程序设计竞赛决赛-重现赛-B题
  10. jsp的session完成登陆功能