如何djunit 测试 私有方法私有 Private/Internal 方法

关注51Testing
JUnit 3.8通过反射测试私有方法
发表于: 10:23 &作者:starskyhu & 来源:51Testing软件测试网采编
推荐标签:
  私有(private)的方法有两种:  1)把目标类的私有方法(修饰符:private)修改为(public),不推荐,因为修改了源程序不佳  2)通过反射 (推荐)  代码演示:  目标程序PrivateMethod.javapackage com.junit3_8;public class PrivateMethod {//私有方法private int add(int a, int b){return a +}}  测试程序PrivateMethodTest.javapackage com.junit3_8;import .lang.reflect.Mimport junit.framework.Aimport junit.framework.TestC/*** 通过反射测试私有方法,**/public class PrivateMethodTest extends TestCase {public void testAdd() throws Exception{//PrivateMethod pm = new PrivateMethod();//获取目标类的class对象Class&PrivateMethod& class1 = PrivateMethod.//获取目标类的实例Object instance = class1.newInstance();//getDeclaredMethod() &可获取 公共、保护、默认(包)访问和私有方法,但不包括继承的方法。//getMethod() 只可获取公共的方法Method method = class1.getDeclaredMethod("add", new Class[]{int.class,int.class});//值为true时 反射的对象在使用时 应让一切已有的访问权限取消method.setAccessible(true);Object result = method.invoke(instance, new Object[]{1,2});Assert.assertEquals(3, result);}}  小结:  getDeclaredMethod() &可获取 公共、保护、默认(包)访问和私有方法,但不包括继承的方法。 getMethod() 只可获取公共的方法  Method method = class1.getDeclaredMethod("add", new Class[]{int.class,int.class});  等价于  Method method = class1.getDeclaredMethod("add", new Class[]{Integer.TYPE,int.Integer.TYPE});
搜索风云榜
51Testing官方微信
51Testing官方微博
测试知识全知道cppunit 怎么测试私有函数_百度知道phpunit如何测试私有方法 - 推酷
phpunit如何测试私有方法
如果你需要测试一些私有方法,那这篇文章可能可以帮助到你。
有一个问题,是我在做单元测试的时候一次又一次遇到:“我该如何去测试我的对象中的哪些私有属性和私有方法呢?”
让我们假设有一个Foo类:
<?php class Foo { private $bar = 'baz'; public function doSomething() { return $this-&bar = $this-&doSomethingPrivate(); }
private function doSomethingPrivate()
return 'blah';
在我们解释如何受保护和私有的属性及方法如何被直接测试之前,先来看看它们是如何被间接的测试的。下面的测试代码调用包含使用doSomethingPrivate()私有方法的testDoSomething()方法:
<?php class FooTest extends PHPUnit_Framework_TestCase { /** * @covers Foo::doSomething * @covers Foo::doSomethingPrivate */ public funciton testDoSomething() { $foo = new F $this-&assertEquals('blah', $foo-&doSomething()); } } ?&
上面的测试假设testDoSomething()只有在testDoSomethingPrivate()方法工作正确的时候才能正常工作。这意味着我们已经间接的测试了testDoSomethingPrivate()。这里到问题是,当出现测试失败的时候我们不能直接的知道故障的起因在哪里。这有可能是由于testDoSomething()或者testDoSomethingPrivate()方法引起的,这降低了该测试的重要性。
PHPUnit通过PHPUnit_Framework_Assert::readAttribute()方法支持读取保护或者私有属性。可以方便的使用诸如PHPUnit_Framework_Assert::assertAttributeEquals()来快速断言保护和石油属性。
class FooTest extends PHPUnit_Framework_TestCase
public function testPrivateAttribute()
$this-&assertAttributeEquals(
‘baz’, /* expected value */
‘bar’, /* attribute name */
new Foo /* object */
PHP 5.3.2引进了ReflectionMethod::setAccessible()方法允许通过Reflection API来调用保护和私有性的方法。
class FooTest extends PHPUnit_Framework_TestCase
* @covers Foo::doSomethingPrivate
public function testPrivateMethod()
$method = new ReflectionMethod(
'Foo', 'doSomethingPrivate'
$method-&setAccessible(TRUE);
$this-&assertEquals(
‘blah’, $method-&invoke(new Foo)
在上面的测试里,我们直接对testDoSomethingPrivate()方法进行测试。当它执行失败的时候我们能夠立即知道是什么位置引起的。
我同意Dave Thomas和Andy Hunt在他们的《单元测试编程》里写的:
“一般情况下,你不愿为了测试的目的去破坏任何封装.大多数时候,你应该能通过它的公共方法来测试一个类。如果有一个重要的方法被隐藏在私有或者保护的访问权限中,那可能是一个警告信号说另一个类无法使用。”
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致3066人阅读
Java专区(81)
eclipse中如何写一个测试私有方法的junit?假设类Summer定义如下:public class Summer{&&&private int methodone(String argsone){&&&&&&//method code&&&&&&.......&&&&&&return&4;&&&}}测试如下:public class SummerTest extends TestCase {&&&public void testMethodone(){&&&&&&Object rightResult =&&&&&&Summer&example =&new Summer.newInstance();&&&&&&Method m =&example .getClass().getDeclaredMethod(&methodone&,new Class[]{String.class});&&&&&&m.setAccessible(true);&&&&&&Object result = m.invoke(example ,new&Object[]&{new String(xxxx)});&&&&&&m.setAccessible(false);&&&&&&if (result.equals(rightResult)){&&&&&&&&&//your code&&&&&&&&&......&&&&&&}&&&}}
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1236622次
积分:11907
积分:11907
排名:第795名
原创:185篇
转载:49篇
评论:157条
(1)(1)(3)(1)(2)(2)(3)(1)(1)(3)(9)(5)(4)(4)(4)(11)(9)(17)(7)(2)(1)(2)(1)(8)(1)(1)(1)(1)(4)(1)(2)(4)(4)(1)(3)(1)(2)(1)(2)(5)(2)(1)(6)(9)(2)(6)(2)(1)(10)(2)(3)(2)(1)(1)(1)(3)(2)(2)(16)(5)(2)(2)(7)(4)(1)(3)(3)junit&测试私有方法或私有变量
Method method = targetClass.getDeclaredMethod(methodName, argClasses);
method.setAccessible(true);return method.invoke(targetObject, argObjects);
Field field = targetClass.getDeclaredField(fieldName);
field.setAccessible(true);
field.set(object, value);
Method&method&=&targetClass.getDeclaredMethod("方法名",&方法参数类型);
method.setAccessible(true);return&method.invoke(类的实例,&方法参数值);
Field&field&=&targetClass.getDeclaredField("私有变量名");
field.setAccessible(true);
field.set(类的实例,&私有变量值);
------------------------------------------------------------------------------------
& class NumParser(){
& //私有变量
& private Query query_;
& public &NumParser(Query query){
& & &//构造函数
& & &query_ = query
& &private void fun(){
& & & &//私有方法
& & NumParser numParser = new NumParser(query)
& & Method method = numParser.getClass().getDeclaredMethod("fun", null);
& & method.setAccessible(true);
& & method.invoke(numParser, null);
& & Field field = numParser.getClass().getDeclaredField("query_");
& & field.setAccessible(true);
& & Object after = field.get(numParser);
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 测试私有方法 的文章

 

随机推荐