`

使用Powermock和mockito测试静态方法

阅读更多

        实例:

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-junit测试套件1.6.3版本

    PowerMock是一个扩展了其他Mocking框架(如EasyMock和Mockito)的库,它允许开发者对静态方法、构造函数、final类和方法、私有方法以及删除静态初始化器进行模拟和mock。在传统测试框架中,这些通常是难以或无法测试...

    powermock-mockito-junit-1.6.2.zip

    PowerMock是一个强大的扩展库,它允许开发者模拟静态方法、构造函数、final类和方法、私有方法、删除静态初始化器等,这些都是标准的Java mocking框架如Mockito无法做到的。PowerMock通过字节码操作(Bytecode ...

    powermock-mockito-junit-1.6.3.zip 当前最新版

    这些工具在Java开发中被广泛用于单元测试和模拟,尤其对于处理静态方法、构造器、final类和方法、私有方法等无法直接进行测试的情况。 PowerMock 是一个扩展了其他Mock框架(如Mockito)的库,它允许开发者模拟那些...

    使用PowerMock来Mock静态函数

    PowerMock是一个强大的扩展工具,它可以与Mockito、EasyMock等主流Mock框架结合,允许我们模拟静态方法、构造器、final类和方法、删除静态初始化器等。 标题“使用PowerMock来Mock静态函数”指的是如何利用...

    利用PowerMock模拟静态方法和私有方法的示例

    它的核心功能之一就是能够模拟静态方法、构造函数、final类和方法、私有方法等,这些都是传统单元测试难以处理的部分。 首先,理解静态方法的测试挑战。静态方法与对象实例无关,它们属于类本身,因此无法通过依赖...

    powermock依赖jar文件.rar

    PowerMock是一个强大的Java单元测试框架,它扩展了如Mockito这样的工具,允许开发者模拟静态方法、构造函数、final类和方法、私有方法以及删除静态初始化器。在Java开发中,有时我们需要对不可Mock的对象进行单元...

    单元测试中PowerMock常用方法.

    在单元测试领域,PowerMock是一个强大的工具,它扩展了诸如Mockito等模拟框架的功能,允许开发者模拟静态方法、构造函数、final类和方法、私有方法以及删除静态初始化器等。这一工具对于测试那些难以或者无法正常...

    单元测试模拟框架PowerMock.zip

    PowerMock 也是一个单元测试模拟...PowerMock 的目的就是在当前已经被大家所熟悉的接口上通过添加极少的方法和注释来实现额外的功能,目前,PowerMock 仅支持 EasyMock 和 Mockito。 标签:PowerMock 单元测试

    PowerMock实战手册

    PowerMock作为一款强大的单元测试工具,可以模拟静态方法、构造函数、final类和方法、删除静态初始化器等,使得原本难以测试的代码变得可测。 首先,让我们深入了解PowerMock。PowerMock是一个扩展了其他mocking...

    powermock单元测试

    在提供的压缩包"powermock+静态和私有方法测试代码"中,很可能包含了一些示例代码,展示了如何使用PowerMock进行这类测试。通过分析这些代码,我们可以更深入地理解PowerMock的工作原理和使用方式。 总的来说,...

    PowerMock实战手册.pdf

    它主要用于单元测试,特别是在测试环境中需要模拟静态方法、私有方法、构造函数、final类和方法时。PowerMock解决了在测试中无法通过常规mocking框架覆盖到的特殊用例,如对静态方法或单例对象的控制。 #### 如何...

    powermock源码 详细学习好帮手

    PowerMock 是一个强大的Java单元测试框架,它扩展了其它单元测试工具,如Mockito,使得开发者可以模拟静态方法、构造函数、final类和方法、删除静态初始化器等。这款库在进行复杂对象模拟时非常有用,尤其是在处理...

    汪文君powermock实战教学

    10. **Spy的使用和私有方法的mock**:Spy是Mock的一种扩展,允许部分真实对象的行为与模拟行为结合。同时,PowerMock也能模拟私有方法,这对于测试内部逻辑非常关键。 11. **总结**:最后,课程会回顾整个PowerMock...

    PowerMock\EasyMock的相关资料和文档

    EasyMock是基础,而PowerMock则在其基础上扩展了更多的功能,使得一些难以模拟的Java特性如静态方法、构造函数、final类和方法、删除静态初始化器等变得可测试。 EasyMock是一个强大的模拟框架,它允许开发者创建...

    java单元测试依赖jar和eclipse插件

    PowerMock是一个扩展了其他Mocking框架(如Mockito)的库,它可以模拟静态方法、构造函数、final类和方法、私有方法以及删除静态初始化器。这样,即使被测试的类有难以控制的依赖,我们也能进行有效的单元测试。 ...

    powermock maven respo

    - final类和方法:final类和方法不能被继承或重写,PowerMock可以模拟它们的行为。 - 私有方法:通常私有方法不直接暴露给测试,但有时我们需要测试它们的行为。PowerMock可以做到这一点。 - 静态初始化块:这些...

Global site tag (gtag.js) - Google Analytics