前言:

在博客开始之前,我们先讨论一下是否应该对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. bzoj 4570: [Scoi2016]妖怪 凸包

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=4570 题解 我们知道如果一个怪物要取到攻击力的最大值,那么一定是把防御力都转化了 所以我 ...

  2. mysql_use_result的使用

    对于每个可以产生一个结果集的命令(比如select.show.describe, explain, check_table等等),发起mysql_query或者mysql_real_query之后,你 ...

  3. oracle undo表空间大小修改

    redhat:清空回收站 rm -rf  /home/登录用户名/.Trash 例子:rm -rf /home/.Trash-root df命令可以显示目前所有文件系统的可用空间及使用情形: 例子:d ...

  4. [C++ Primer] 第2章: 变量

    初始化与赋值 当对象在创建时获得了一个特定的值, 我们就说这个对象被初始化了. 在使用=号时, 如果创建了新的对象, 则为初始化而非赋值. 初始化不是赋值, 初始化的含义是创建变量时赋予其一个初始值, ...

  5. PHP session 跨子域问题总结 ini_set('session.cookie_domain', ".domain.com")

    Session主要分两部分: 一个是Session数据,该数据默认情况下是存放在服务器的tmp文件下的,是以文件形式存在 另一个是标志着Session数据的Session Id,Session ID, ...

  6. CFGym 101490E 题解

    一.题目链接 http://codeforces.com/gym/101490 二.题面 三.题意 给你一个图,n个点,m条边,一个x,从顶点1走到顶点n.假设从顶点1走到顶点n的最短路为d,x代表你 ...

  7. centos7上mysql无法启动也没有日志

    报错的原因就是 [root@localhost duanxinli]# journalctl -xe-- Subject: Unit mysqld.service has begun start-up ...

  8. C++Builder STL 泛型

    STL(Standard Template Library)标准模板库, 包括了算法,容器,迭代器.就是泛型. 向量(vector) 连续存储的元素<vector>列表(list) 由节点 ...

  9. JSF多列预选择

    <script type="text/javascript"> jQuery(document).ready(function () { preSelect(); }) ...

  10. 迷你MVVM框架 avalonjs 学习教程7、数据缓存

    jQuery的许多功能都可以通过avalon的绑定属性来处理,如click方法对应ms-click,css方法对应ms-css,toggle方法对应ms-visible,它的数据缓存功能avalon也 ...