如何mock一个有mockito 测试私有方法属性的对象

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
——我爱你!——
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(8866)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'使用Powermock和mockito来进行单元测试',
blogAbstract:'\r\n& \r\n简介\r\nMockito是一个流行的Mocking框架。它使用起来简单,学习成本很低,而且具\r\n有非常简洁的API,测试代码的可读性很高。因此它十分受欢迎,用户群越来越\r\n多,很多的开源的软件也选择了Mockito。\r\n要想了解更多有关Mockito的信息,请访问它的官方网站:http://mockito.org/\r\nStub 和Mock\r\n在开始使用Mockito之前,先简单的了解一下Stub和Mock的区别。\r\nStub对象用来提供测试时所需要的测试数据,可以对各种交互设置相应的回应。\r\n例如我们可以设置方法调用的返回值等等。Mockito中when(…).thenReturn(…)',
blogTag:'powermockito,mockito',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:9,
publishTime:4,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:1,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'——我爱你!——',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}类里设置了私有属性怎样从类外给私有属性赋值并访问
通过private就可以把人的成员(成员属性和成员方法)封装上了。封装上的成员就不能被类外面直接访问了,只有对象内部自己可以访问;下面的代码会产生错误:
class&Person
//下面是人的成员属性
private $name;&//人的名子,被private封装上了
private $sex;&//人的性别,&被private封装上了
private $age;&//人的年龄,&被private封装上了
//这个人可以说话的方法
function&say()
echo&"我的名子叫:".$this-&name."&性别:".$this-&sex."&我的年龄是:".$this-&age."&br&";
//这个人可以走路的方法,&被private封装上了
private function&run()
echo&"这个人在走路";
//实例化一个人的实例对象
$p1=new&Person();
//试图去给私有的属性赋值,
结果会发生错误
$p1-&name="张三";
$p1-&sex="男";
$p1-&age=20;
//试图去打印私有的属性,
结果会发生错误
echo $p1-&name.”&br&”;
echo $p1-&sex.”&br&”;
echo $p1-&age.”&br&”
//试图去打印私有的成员方法,
结果会发生错误
$p1-&run();
输出结果为:
Fatal error: Cannot access private property
Person::$name
Fatal error: Cannot access private property
Person::$sex
Fatal error: Cannot access private property
Person::$age
Fatal error: Cannot access private property
Person::$name
Fatal error: Call to private method Person::run() from
context ''
从上面的实例可以看到,私有的成员是不能被外部访问的,因为私有成员只能在本对象内部自己访问,比如,$p1这个对象自己想把他的私有属性说出去,在say()这个方法里面访问了私有属性,这样是可以。(没有加任何访问控制,默认的是public的,任何地方都可以访问)
//这个人可以说话的方法,&说出自己的私有属性,在这里也可以访问私有方法
function&say()
echo&"我的名子叫:".$this-&name."&性别:".$this-&sex."&我的年龄是:".$this-&age."&br&";
//在这里也可以访问私有方法
//$this-&run();
因为成员方法say()是公有的,所以我们在类的外部调用say()方法是可以的,改变上面的代码;
class&Person
//下面是人的成员属性
private $name;
&&&&&&//人的名子,被private封装上了
private $sex;
&&&&&&&//人的性别,&被private封装上了
private $age;
&&&&&&&//人的年龄,&被private封装上了
//定义一个构造方法参数为私有的属性姓名$name、性别$sex和年龄$age进行赋值
function&__construct($name,&$sex,&$age)
//通过构造方法传进来的$name给私有成员属性$this-&name赋初使值
$this-&name=$name;
//通过构造方法传进来的$sex给私有成员属性$this-&sex赋初使值
$this-&sex=$sex;
//通过构造方法传进来的$age给私有成员属性$this-&age赋初使值
$this-&age=$age;
//这个人可以说话的方法,&说出自己的私有属性,在这里也可以访问私有方法
function&say()
echo&"我的名子叫:".$this-&name."&性别:".$this-&sex."&我的年龄是:".$this-&age."&br&";
//通过构造方法创建3个对象$p1、p2、$p3,分别传入三个不同的实参为姓名、性别和年龄
$p1=new&Person(“张三”,”男”,&20);
$p2=new&Person(“李四”,”女”,&30);
$p3=new&Person(“王五”,”男”,&40);
//下面访问$p1对象中的说话方法
$p1-&say();
//下面访问$p2对象中的说话方法
$p2-&say();
//下面访问$p3对象中的说话方法
$p3-&say();
输出结果为:
我的名子叫:张三性别:男我的年龄是:20
我的名子叫:李四性别:女我的年龄是:30
我的名子叫:王五性别:男我的年龄是:40
因为构造方法是默认的公有方法(构造方法不要设置成私有的),所以在类的外面可以访问到,这样就可以使用构造方法创建对象,另外构造方法也是类里面的函数,所以可以用构造方法给私有的属性赋初值。Say()的方法是默认公有的,所以在外面也可以访问的到,说出他自己的私有属性。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。mock出来的对象怎么为该对象进行mock_百度知道5495人阅读
JAVA实用笔记(142)
Mock的中文的意思就是模拟,Mockito是一个模拟对象框架,主要还是用于单元测试中,它通过隐藏真实的实现来返回我们期望的结果,这样我们就可以排除其它可能对当前单元的执行结果产生影响的其它因素,如我们的某个功能需要调用一个远程接口,但是这个时候我们只需要关心当前功能是否能够正常工作而不需要关心远程接口是否正常工作,我们就可以通过模拟远程接口返回的正确或者错误&#20540;进行测试。
这是两篇关于Mockito可以快速入门的文章:
http://blog.csdn.net/onlyqi/article/details/6396646
http://blog.csdn.net/onlyqi/article/details/6546589
这其中介绍了Mockito的基本使用方式,以及可供参的例子,对初次接触的Mockito的人来说,算是不错的入门文档。
下面是Mockito本身的Javadoc中带的实例,只不过是全英文的,和上面提到的两篇文章有异曲同工之处,只不过会介绍得更加介绍一些,有兴趣的话可以看看:
/svn/branches/1.6/javadoc/org/mockito/Mockito.html
在实际的操作过程当中,我们经常会对类成员的变量进行Mock,特别是对第三文类库中类的类成员变量进行Mock,这个时候我们不能够去修改第三方库的源代码,我们这个时候可以有两种方式来达这个目的:
1、通过使用继续的方式
不过这种方式会受限于被Mock的类成员变量的变量定义范围,只有public及protected的才可以使用这种方式,如以下是一个第三方库的一个类:
public class OneClass{
protected TestA testA;
我们这个时候可以在Mock的测试类中使用一个类来继承这个类,然后把变量通过子类的super调用传给父类:
private class OneClassChild extends OneClass{
public OneClassChild(TestA testA){
super.testA = testA;
我们的Mock代码就可以写成这样了:
public void testMock(){
TestA testA = new TestA();
OneClass oneClass = new OneClassChild(testA);
//假设需要调用方法callOneClassMethod,Return根据实际情况进行返回了
when(oneClass.callOneClassMethod()).thenReturn(0);
这样就达到Mock了OneClass中的类成员变量testA的目的,用我们需要的返回结果,替代了真实的返回结果。
2、通过使用反射的方式
如这个时候第三方类库中的类的成员变量为私有的:
public class OneClass{
private TestA testA;
这个时候通过反射的方式将这个类中的成员变量给替换掉,这个时候的Mock代码就会如下:
public void testMock(){
TestA testA = new TestA();
OneClass oneClass = new OneClass();
Field testAField = oneClass.getClass().getDeclaredField(&testA&);
testAField.setAccessible(true);
testAField.set(oneClass, testA);
//假设需要调用方法callOneClassMethod,Return根据实际情况进行返回了
when(oneClass.callOneClassMethod()).thenReturn(0);
比较上面的两种方式,还是第二种比较通用,不会受到变量的可见性的影响。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:5796146次
积分:55178
积分:55178
排名:第35名
原创:461篇
转载:209篇
译文:28篇
评论:1649条
(3)(7)(7)(10)(3)(5)(2)(3)(10)(3)(1)(10)(8)(1)(1)(11)(13)(18)(9)(5)(2)(13)(14)(31)(1)(1)(2)(3)(4)(13)(3)(1)(12)(6)(4)(6)(4)(2)(1)(6)(15)(35)(11)(3)(2)(25)(2)(3)(13)(2)(5)(2)(1)(15)(5)(7)(8)(41)(33)(54)(40)(7)(2)(4)(1)(12)(17)(3)(8)(8)(1)(55)}

我要回帖

更多关于 powermock 私有变量 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信