当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

使用Powermock和mockito测试静态方法

发表于: 2013-12-06   作者:bijian1013   来源:转载   浏览:
摘要:         实例: package com.bijian.study; import static org.junit.Assert.assertEquals; import java.io.IOException; import org.junit.Before; import org.junit.Test; import or

        实例:

package com.bijian.study;

import static org.junit.Assert.assertEquals;

import java.io.IOException;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

class MyStringUtil {   
	  
    public static String uppercase(String s) {   
        return s.toUpperCase();   
    }   
}   

//1.标注使用PowerRunner运行test(powermock会修改字节码) 
@RunWith(PowerMockRunner.class)

//2.设置mock类(支持多个类,逗号分隔),这个可以设置到class上,也可以设置到method上
//这里面包含两种类型: 
//a.被mock的类(如上例MyStringUtil .class,如果mock类为系统类,如System.class,则不需要这里设置就可以使用)
//b.context类,如果是在XxxServer里面希望mock MyStringUtil类,则要设置 XxxServer.class
@PrepareForTest({ MyStringUtil.class })  
public class HelloTest {   
  
    @Before  
    public void before() {
    	//3.告诉powermock需要mock哪个类
        PowerMockito.mockStatic(MyStringUtil.class);  
    }   
  
    @Test  
    public void test() throws IOException {
    	//4.打桩,设置mock对象返回预期值
        PowerMockito.when(MyStringUtil.uppercase("abc")).thenReturn("ABC");
        
        //5.执行mock方法,返回预期值
        assertEquals("ABC", MyStringUtil.uppercase("abc"));   
    }   
}

        注意:如上代码引入javassist-3.4.GA.jar、junit-4.9.0.jar、mockito-all-1.9.0.jar、powermock-mockito-1.4.12-full.jar能正常运行。

 

        附:如使用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.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.<init>(JUnit4TestSuiteChunkerImpl.java:47)
	at org.powermock.modules.junit4.common.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

使用Powermock和mockito测试静态方法

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
引言 Hadoop MapReduce作业有着独一无二的代码架构,这种代码架构拥有特定的模板和结构。这样的架构
安装 下载地址:https://github.com/jayway/powermock/wiki/Downloads。下载" Mockito and JUnit in
准备 本文需要Java和Junit基础,可参考:使用Junit进行单元测试教程,Java程序设计简介。 项目地址
1. 为什么使用Mockito来进行单元测试? 回答这个问题需要回答两个方面,第一个是为什么使用mock?mo
Mock的中文的意思就是模拟,Mockito是一个模拟对象框架,主要还是用于单元测试中,它通过隐藏真实的
根据ISO/IEC 9126质量模型作为基础,我们可以构造质量度量模型,用于评估软件的各个方面。该模型从
由于Apple禁止在iPhone中使用外部框架或动态链接库,所以要重用代码(第三方库或自己的代码)只能选
2012-03-23 09:40:44| 分类: 11月|字号 订阅 <div class="bct fc05 fc11 nbw-blog ztag js-fs2"
Being.java : public interface Being { public void testBeing(); } Dog.java : public class Dog
1.在4.4.2版本中滑动屏幕时scrollForward()不起作用而swipeLeft()可以滑动? (如果想知道结果,直
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号