前言:

在博客开始之前,我们先讨论一下是否应该对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方法调用和执行被测试类中私有方法;

感谢您的阅读~

在MS Test中如何测试private方法的更多相关文章

  1. .NET中如何测试Private和Protected方法

    TDD是1)写测试2)写通过这些测试的代码,3)然后重构的实践.在,NET社区中, 这个概念逐渐变得非常流行,这归功于它所增加的质量保证.此时,它很容易测试public方法,但是一个普遍的问题出现了, ...

  2. java中static,final,private方法的继承多态问题

    父类中的final  private方法不能被继承,父类中的static方法可以被继承,但是不能重写,这三者都属于前期绑定,java中除了这三种以及构造方法之外剩下的都是后期绑定(运行是绑定). 当父 ...

  3. mock中测试private方法,不是mock

    Method method = PowerMockito.method(CategoryController.class, "getCategory",List.class);// ...

  4. Junit测试private方法

    package com.bill99.junit; public class ACase { private String echoRequest(String request) { return & ...

  5. 使用 Visual Studio Team Test 进行单元测试和java中的测试

    C#中test测试地 方法一. 1.从NUnit官网(http://www.nunit.org/index.php)下载最新版本NUnit,当前版本为NUnit2.5.8. 2.安装后,在VS2008 ...

  6. [bug]spring项目通过反射测试私有方法时,注入对象异常

    背景 遇到问题:在进行Spring单元测试编写时,发现被测方法是一个私有方法,无法直接通过注入对象调用 解决思路:首先想到通过反射获取该私有方法的访问权限,并传入注入对象,最终调用对象的私有方法. 出 ...

  7. PHPUnit单元测试中类protected/private方法测试

    这里首先有一个问题要考虑的是,这类方法是否要被测试? 理论上,这类方法都会被其它public类型的方法调用,只要对那些public的方法做充分的测试,就可以保证这些方法的可靠性,就没有必要再测了.好像 ...

  8. Ms SQLServer中的Union和Union All的使用方法和区别

    Ms SQLServer中的Union和Union All的使用方法和区别 SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION 内部的 ...

  9. 关于c++中public & private方法调用问题

    class IDNoIdentifier { public: IDNoIdentifier(); ~IDNoIdentifier(); typedef vector<cv::Rect> C ...

随机推荐

  1. 关于const 和指针

    这个很久之前就很困扰的问题,现在再理一下: 1,指向const对象的指针 >C++强制要求指向const对象的指针也必须具有const特性!!!也就是不能把一个const对象的地址赋给一个非co ...

  2. [Luogu4609][FJOI2016]建筑师

    luogu description 一个\(1...n\)的排列,其前缀最大值有\(A\)个,后缀最大值有\(B\)个,求满足要求的排列数. 一个位置\(i\)满足前缀最大当且仅当不存在\(j< ...

  3. proc 文件系统学习

    proc.txt翻译 ------------------------------------------------------------------------------Version 1.3 ...

  4. HBase的几个实示例(二)

    1 开发环境 在进行Hbase开发前,需要安装JDK.Hadoop和Hbase,选择一款合适的开发IDE,具体安装方法就不介绍了,我的开发环境: 操作系统:Ubuntu Java版本:jdk1.8 H ...

  5. ajax请求返回Json字符串运用highcharts数据图表展现数据

    [1].[图片] Json字符串和highcharts数据图表展现.jpg 跳至 [1] code=26754#44745" rel="nofollow"> [2] ...

  6. Git Flow分支策略

    就像代码需要代码规范一样,代码管理同样需要一个清晰的流程和规范 Vincent Driessen 同学为了解决这个问题提出了 A Successful Git Branching Model 下面是G ...

  7. 【转】嵌入式Linux启动配置文件及脚本

    原文网址:http://blog.csdn.net/shuaishuai80/article/details/6202497 使用Busybox制作根文件系统时,/etc目录非常重要,它包含了嵌入式L ...

  8. Mybatis selectKey标签的keyProperty属性报错,关键字间隔不能有空格

    源代码片段: <insert id="addAdminAction" parameterType="x.x.x.RoleVo"> <selec ...

  9. 在pydev安装完成后在eclipse不显示的问题

    Java配置: http://www.jb51.net/os/win10/370409.html http://blog.csdn.net/wwd0501/article/details/521308 ...

  10. [置顶] Ubuntu16.04+opencv3.3.0的安装配置说明

    系统环境:  Linux Ubuntu 16.04  [GCC 5.4.0 20160609] on linux2 之前的教程中我们已经安装了做机器学习需要使用的框架TensorFlow,笔者本科阶段 ...