Java如何用powermock private测试 void类型的方法?请给出具体的实例谢谢

java泛型应用实例 - 自定义泛型类,方法
- Sunstrider的专栏 - ITeye技术网站
博客分类:
本文主要讲解道
可以下载到完整的java代码工程:
短时间需要使用泛型,就研究了下,发现网上的问关于泛型的文章都是讲原理的, 很少有提到那里用泛型比较合适, 本文就泛型类和泛型方法的使用给出两
个典型应用场景. 例如一个toString的泛型方法,就可以将所有的Bean按照指定格式转换成字符串,
就可以避免每个Bean都要实现toString方法.
1. 先简单说两句我对泛型的理解
泛型的本质就是将数据类型也参数化, 普通方法的输入参数的值是可以变的,但是类型(比如: String)是不能变的,它使得了在面对不同类型的输入参数的时候我们要重载方法才行. 泛型就是将这个数据类型也搞成跟参数的值一样可以变的.
泛型分为泛型接口,泛型类和泛型方法. 泛型接口,泛型类大家都比较熟悉了,应该都用过List,
ArrayList. List就是泛型接口,ArrayList就是泛型类,
我们经常看到List &E&的声明, new ArrayList&E&()的定义, 这里面的E可以是String, 也可以自己定义的类(例如: CarBean). 我感觉泛型类就JDK提供的就基本够用了,自定义使用的场景非常少了.
反而是泛型方法,对与解析自定义数据结构非常有用, 类似于toString这种场景是百试不爽.
java泛型的性能应该是没有问题的,说白了就是JDK做了个类型转换呗,很多网友就验证过,
我懒得验了,感兴趣的可以参考下我转载的这篇文章:
2. 泛型类应用实例(泛型接口不再举例,跟类差不多)
我理解泛型类就是简化版的extend 或者overwrite, 例如ArrayList, 如果对象需要add, getIndex等数组操作就可以生成一个该对象的ArrayList, 使用扩展或者重写可以实现,但是明显泛型要简便的多,定义个新对象就搞定了.
泛型类实例就是延续这个思路, 车和房子都有品牌,名字和价钱,都是商品或者货物这种数据结构,一般需要获取品牌,名字和价钱的描述信息.
我就将货物定义为泛型类,获取描述信息就是泛型类里面的通用方法.
房和车的Bean先贴出来,一看就明白,不赘述了.
HouseBean.java
CarBean.java
com.ross.generic.
Goods的泛型类也定义出来,就是类名后面加个&T&, 他的主要功能就是获取泛型实例化的类型,并返回描述信息.
方法就是将实例化对象的信息设置下,
然后在泛型类的方法中进行规整(当然实际应用的时候是可以先做查询数据库等分析,然后给出完整描述,例如售后服务,品牌推广等信息);
getClassType方法就是范围实例化对象的类型了, 主要是方便体验. 下面是代码:
GenericGoods.java
java.lang.reflect.M
GenericGoods&T&
GenericGoods(T oT)
setData(String sBrand, String sName, String sPrice)
.information =
+ sBrand +
+ sPrice + "!"
String getClassType()
t.getClass().getName();
我们写个Main函数运行 一下.
java.lang.reflect.InvocationTargetE
com.ross.generic.bean.CarB
com.ross.generic.bean.HouseB
main(String[] args)
SecurityException,
IllegalArgumentException, NoSuchMethodException,
IllegalAccessException, InvocationTargetException
GenericGoods&CarBean& oGGCar = new
GenericGoods&CarBean&(
CarBean());
oGGCar.setData("Mercedes"
"666,000 RMB"
System.out.println("CarBean test: Type of class - "
+ oGGCar.getClassType() + "; Information of the goods: "
+ oGGCar.getInformation());
GenericGoods&HouseBean& oGGHouse = new
GenericGoods&HouseBean&(
HouseBean());
oGGHouse.setData("Shenzhen Wanke City"
"3 rooms with 3 restrooms house"
"2,000,000 RMB"
System.out.println("HouseBean test: Type of class - "
+ oGGHouse.getClassType() + "; Information of the goods: "
+ oGGHouse.getInformation());
控制台打印信息:
CarBean test: Type of
- com.ross.generic.bean.CarB Information of the goods: This Benz of Mercedes costs
HouseBean test: Type of class
- com.ross.generic.bean.HouseB Information of the goods: This
rooms with
restrooms house of Shenzhen Wanke City costs
3. 泛型方法应用实例
同样的基于上面的房和车的Bean进行功能验证-:)
概念不要弄混了, 泛型方法不一定要在泛型类里面. 这个GenericMethodProcess
不是泛型类,
在其中定义了定义了我们泛型方法toString, 它的功能就是按照指定的格式将Bean转换成String
(当然,这种场景我们可以实现其他的功能,比如将表数据读取到Bean中,一个泛型方法可以搞定所有表).
代码中有详细注释不在解释了,其中用到了一点反射机制,不熟悉的可以网上搜点资料了解,或关注我后续
GenericMethodProcess.java
java.lang.reflect.F
java.lang.reflect.InvocationTargetE
java.lang.reflect.M
GenericMethodProcess
&T& String toString(T oT)
SecurityException,
NoSuchMethodException, IllegalArgumentException,
IllegalAccessException, InvocationTargetException
String sRet = ""
String sGetMethodName = ""
String sFieldName = ""
Field[] oFields = oT.getClass().getDeclaredFields();
!= oFields)
; i & oFields. i++)
oFields[i].setAccessible(true
sFieldName = oFields[i].getName();
(sFieldName.length() &
sGetMethodName = "get"
+ sFieldName.substring(0
).toUpperCase()
+ sFieldName.substring(1
, sFieldName.length());
sGetMethodName = "get"
+ sFieldName.toUpperCase();
oMethod = oT.getClass().getMethod(sGetMethodName);
sRet = sRet + sFieldName + "="
+ oMethod.invoke(oT) +
.equals(sRet))
sRet = sRet.substring(0
, sRet.length() -
我们写个Main函数运行
java.lang.reflect.InvocationTargetE
com.ross.generic.bean.CarB
com.ross.generic.bean.HouseB
main(String[] args)
SecurityException,
IllegalArgumentException, NoSuchMethodException,
IllegalAccessException, InvocationTargetException
GenericMethodProcess oGMP = new
GenericMethodProcess();
CarBean oCarBean = new
CarBean();
oCarBean.setBrand("Mercedes"
oCarBean.setName("BMW"
oCarBean.setPrice("888,000 RMB"
String sBeanStr = oGMP.toString(oCarBean);
System.out.println("CarBean toString: "
+ sBeanStr);
HouseBean oHouseBean = new
HouseBean();
oHouseBean.setBrand("Shanghai Wanke City"
oHouseBean.setName("4 rooms with 4 restrooms house"
oHouseBean.setPrice("6,000,000 RMB"
sBeanStr = oGMP.toString(oHouseBean);
System.out.println("HouseBean toString: "
+ sBeanStr);
控制台打印信息:
CarBean toString: brand=Mname=BMW;price=
HouseBean toString: brand=Shanghai Wanke Cname=4
rooms with
4.泛型的一些规则和限制
1) 泛型的类型参数只能是类类型(包括自定义类),不能是基本数据类型。
2) 泛型的类型参数可以有多个。
3) 泛型的参数类型可以使用extends语句,例如&T extends superclass&。习惯上称为“有界类型”。
4) 泛型的参数类型还可以是通配符类型。例如Class&?& classType = Class.forName("java.lang.String");
浏览 16667
hejiangtao
浏览: 40030 次
来自: 杭州
写的不错啊
请问你是如何测试的.谢谢
这篇文章不错,可以在面试的时候跟面试官扯扯,实际应用应该很少使用Powermock跟mockito测试静态方法 - 编程当前位置:& &&&使用Powermock跟mockito测试静态方法使用Powermock跟mockito测试静态方法&&网友分享于:&&浏览:196次使用Powermock和mockito测试静态方法
使用Powermock和mockito测试静态方法时,如运行单元测试报”NoClassDefFoundError: javassist/util/proxy/MethodFilter“错误,详细如下所示:
java.lang.NoClassDefFoundError: javassist/expr/ExprEditor
at org.powermock.tests.utils.impl.AbstractTestSuiteChunkerImpl.createNewClassloader(AbstractTestSuiteChunkerImpl.java:196)
at org.powermock.tests.utils.impl.AbstractTestSuiteChunkerImpl.chunkClass(AbstractTestSuiteChunkerImpl.java:170)
at org.powermock.tests.utils.impl.AbstractTestSuiteChunkerImpl.&init&(AbstractTestSuiteChunkerImpl.java:92)
at org.powermock.tests.utils.impl.AbstractTestSuiteChunkerImpl.&init&(AbstractTestSuiteChunkerImpl.java:85)
at org.powermock.mon.internal.impl.JUnit4TestSuiteChunkerImpl.&init&(JUnit4TestSuiteChunkerImpl.java:47)
at org.powermock.mon.internal.impl.AbstractCommonPowerMockRunner.&init&(AbstractCommonPowerMockRunner.java:32)
at org.powermock.modules.junit4.PowerMockRunner.&init&(PowerMockRunner.java:31)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31)
at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.&init&(JUnit4TestReference.java:33)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.&init&(JUnit4TestClassReference.java:25)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:48)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.ClassNotFoundException: javassist.expr.ExprEditor
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 25 more
解决方法:引入javassist-3.4.GA.jar
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有我想从其中包含2 m1和m2的类的M1。我想M1返回一个对象。
我尝试了以下
PowerMockito.mockStatic(Static.class, new Answer&Long&() {
public Long answer(InvocationOnMock invocation) throws Throwable {
return 1000l;
这两个调用m1和m2,其中有不同的返回类型,所以它给人的返回类型不匹配错误。
2)PowerMockito.when(Static.m1(param1, param2)).thenReturn(1000l);但是,当执行M1这不叫。
3)PowerMockito.mockPartial(Static.class, "m1");的错误,这是我从拿到mockPartial不可用
恳请知道解决这个问题。
在此先感谢。
本文地址 :CodeGo.net/455960/
-------------------------------------------------------------------------------------------------------------------------
1. 你想要做的是1和部分全部2。
您需要PowerMockito.mockStatic,使静态的嘲弄所有的一类。使人们有可能存根时,thenReturn语法。
但2-mockStatic超载你提供什么,当你打电话给你没有明确存根上的模拟实例的Mockito / PowerMock应该做一个默认的策略。
从javadoc中:
创建一流的模拟与指定的策略,它的答案
相互作用。这是相当先进的函数,通常你不需要
它写像样的测试。但是它可以与工作时会有所帮助
遗留系统。这是默认的答案,因此仅会
你没有存根调用。
默认默认存根策略是只返回null CodeGo.net,0或false的对象,数量和布尔的2-ARG超载,你说“不,不,不,这个答案子'来获得一个默认值,它返回一个长,所以如果你有哪些与龙回来,有一个问题。
相反,使用mockStatic的1-精氨酸的版本,使时,thenReturn的存根,以指定该怎么做了,例如:
import static org.mockito.Mockito.*;
import org.junit.T
import org.junit.runner.RunW
import org.mockito.invocation.InvocationOnM
import org.mockito.stubbing.A
import org.powermock.api.mockito.PowerM
import org.powermock.core.classloader.annotations.PrepareForT
import org.powermock.modules.junit4.PowerMockR
class ClassWithStatics {
public static String getString() {
return "String";
public static int getInt() {
@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassWithStatics.class)
public class StubJustOneStatic {
public void test() {
PowerMockito.mockStatic(ClassWithStatics.class);
when(ClassWithStatics.getString()).thenReturn("Hello!");
System.out.println("String: " + ClassWithStatics.getString());
System.out.println("Int: " + ClassWithStatics.getInt());
该字符串值是存根返回“你好!”,而整型值使用默认的存根,返回0。
本文标题 :PowerMockito模拟单一的静态方法,返回对象
本文地址 :CodeGo.net/455960/
Copyright (C) 2014 CodeGo.net 沪ICP备号 联&系& c&o&d&e&g&o &@&1&2&6&.&c&o&m

我要回帖

更多关于 powermock jar 的文章

 

随机推荐