`

PowerMock常见用法

阅读更多

 

import org.junit.Assert;  
import org.junit.Test;  
import org.junit.runner.RunWith;  
import org.mockito.Mockito;  
import org.powermock.api.mockito.PowerMockito;  
import org.powermock.core.classloader.annotations.PrepareForTest;  
import org.powermock.modules.junit4.PowerMockRunner;  
  
@RunWith(PowerMockRunner.class)  
@PrepareForTest({ MyClass.class})  
public class StaticClassSampleTest {  
  
	@Test  
	public void testPrivateMethod() throws Exception {  
		// 模拟 private的方法  
		MyClass spy = PowerMockito.spy(new MyClass());  
		PowerMockito.doReturn(3).when(spy, "private_method", 1);  
		Assert.assertEquals(3, spy.test_private_method(1));  
		PowerMockito.verifyPrivate(spy, Mockito.times(1)).invoke("private_method", 1);  
	}  
  
	@Test  
	public void testStaticReturnMethod() throws Exception {  
		// 模拟 静态有返回值的方法  
		PowerMockito.mockStatic(MyClass.class);  
		Mockito.when(MyClass.static_return_method()).thenReturn(2);  
		Assert.assertEquals(2, MyClass.static_return_method());  
	}  
  
	@Test  
	public void testVoidMethod() throws Exception {  
		// 模拟 不执行void的方法  
		MyClass spy = PowerMockito.spy(new MyClass());  
		PowerMockito.doNothing().when(spy).void_method();  
		spy.void_method();  
	}  
  
	@Test  
	public void testStaticMethod1() throws Exception {  
		// 模拟 不执行没参数的静态void的方法  
		PowerMockito.mockStatic(MyClass.class);  
		PowerMockito.doNothing().when(MyClass.class, "static_void_method");  
		MyClass.static_void_method();  
	}  
  
	@Test  
	public void testStaticMethod2() throws Exception {  
		// 模拟 不执行带参数的静态void的方法  
		PowerMockito.mockStatic(MyClass.class);  
		PowerMockito.doNothing().when(MyClass.class, "staticMethod", "123");  
		MyClass.staticMethod("123");  
  
		PowerMockito.doNothing().when(MyClass.class, "staticMethod", Mockito.anyString());  
		MyClass.staticMethod("456");  
	}  
  
}  
  
class MyClass {  
  
	final private int private_method(int a) {  
		return a;  
	}  
  
	public int test_private_method(int a) {  
		return private_method(a);  
	}  
  
	public static int static_return_method() {  
		return 1;  
	}  
  
	void void_method() {  
		throw new IllegalStateException("should not go here");  
	}  
  
	public static void static_void_method() {  
		throw new IllegalStateException("should not go here");  
	}  
  
	public static void staticMethod(String a) {  
		throw new IllegalStateException(a);  
	}  
}  

    maven依赖

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-all</artifactId>
    <version>1.8.5</version>
</dependency>
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-module-junit4</artifactId>
    <version>1.4.10</version>
</dependency>
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-mockito</artifactId>
    <version>1.4.10</version>
</dependency> 

    另外补一下,测试目标方法内部对象的mock方式:

// 测试目标代码:
public class ClassUnderTest {
    public boolean callInternalInstance(String path) {
        File file = new File(path); 
        return file.exists(); 
    }
}
// 测试用例代码
@RunWith(PowerMockRunner.class) 
public class TestClassUnderTest{
    @Test 
    @PrepareForTest(ClassUnderTest.class) 
    public void testCallInternalInstance() throws Exception{
        File file = PowerMockito.mock(File.class); 
        ClassUnderTest underTest = new ClassUnderTest();
        PowerMockito.whenNew(File.class).withArguments("bbb").thenReturn(file);
        PowerMockito.when(file.exists()).thenReturn(true); 
        Assert.assertTrue(underTest.callInternalInstance("bbb")); 
    }
}

 

 *当某个测试方法被注解@PrepareForTest标注以后,
 在运行测试用例时,会创建一个新的org.powermock.
 core.classloader.MockClassLoader实例,
 然后加载该测试用例使用到的类(系统类除外)。
*PowerMock会根据你的mock要求,去修改写在
 注解@PrepareForTest里的class文件(当前测
 试类会自动加入注解中),以满足特殊的mock需求。
 例如:去除final方法的final标识,
 在静态方法的最前面加入自己的虚拟实现等。
*如果需要mock的是系统类的final方法和静态方法,
 PowerMock不会直接修改系统类的class文件,
 而是修改调用系统类的class文件,以满足mock需求。

 

分享到:
评论

相关推荐

    easymock3.1 jar包和powermock1.4.10 jar包(以及附带junit jar包)

    6. 使用PowerMock的`@PrepareForTest`注解来指定需要模拟的类或方法。 在使用这两个库时,要注意避免过度依赖模拟,因为过多的模拟可能掩盖了真实代码的问题。理想情况下,应该只模拟那些难以构造或不易控制的依赖...

    powermock-demo:powermock演示

    该项目的目的是向开发者展示 PowerMock 的基本用法和常见应用场景,帮助他们更好地理解和掌握这一工具。 首先,我们需要了解 PowerMock 的核心概念: 1. **类模拟(Class Mocking)**:允许模拟 final 类和无法实例...

    powermock-开源

    例如,`powermock-junit3-0.6-source.zip`和`powermock-junit4-0.6-source.zip`包含了与这些版本的JUnit的源代码,便于开发者理解和自定义PowerMock的使用。 示例项目如`powermock-samples-0.6-source.zip`和`...

    单元测试中一些必要的jar包

    3. **PowerMock**:PowerMock是在EasyMock基础上的一个扩展,它添加了一些强大的功能,如模拟静态方法、构造函数、final类和方法、删除静态初始化器等。在某些情况下,当常规的mocking技术无法满足需求时,PowerMock...

    mock 介绍及原理,前后端 mock方法

    在后端开发中,Mock 可以使用框架如 Mockito、PowerMock、Mockserver、Moco 等,对服务的请求和响应进行模拟。 Mock 的好处包括: * 可以并行工作,不需要等待依赖方的开发完成 * 可以方便构造出各种异常的场景,...

    eclipse单元测试所需jar包

    4. PowerMock:扩展了Mockito,可以模拟静态方法、构造函数、final类和方法、私有方法等,适用于更复杂的测试场景。 5. EasyMock:另一个模拟框架,可以创建和控制对象的行为,适合简单的模拟需求。 6. TestNG:一...

    Packt Publishing Mockito Essentials (2014)

    - **测试障碍**:探讨了遗留代码中常见的测试障碍,如静态方法、构造函数问题等。 - **使用PowerMock**:PowerMock是一个扩展Mockito的工具,用于解决遗留代码中的一些特殊问题,如: - **模拟静态方法**:...

    SSM整合实现分页以及单元测试代码

    对于SSM整合项目,我们可以使用JUnit作为测试框架,Mockito进行模拟对象测试,PowerMock进行静态方法和私有方法的测试。测试主要包括对Service层和Mapper层的测试,确保业务逻辑和数据库操作的正确性。 6. **...

    方成:手机京东,持续集成中的自动化实践

    PowerMock在这里扮演重要角色,因为其可以对static、final和private方法进行mock,弥补了Mockito的不足。 在iOS平台,他们使用XCTest框架进行单元测试。XCTest提供了一套完整的测试工具,在XCode5中引入,并在XCode...

    测试驱动的Java开发(Test-Driven Java Development)-2015年英文原版,0积分

    - **PowerMock**:用于扩展JUnit和Mockito功能的工具,可以模拟静态方法、构造函数、最终类/方法等。 - **Gradle**:介绍如何使用Gradle作为构建工具来管理项目依赖并运行测试。 - **SonarQube**:一种用于代码质量...

    SSh_Struts2_Test

    1. **单元测试**:针对单个类或方法进行测试,确保它们的功能正确。Spring提供`SpringJUnit4ClassRunner`,结合JUnit,可以方便地进行Spring Bean的单元测试。对于Struts2的Action,我们可以使用Struts2的Mockito...

    开发常用jar4

    4. **PowerMock**:PowerMock是一个扩展了其他mocking框架(如EasyMock和Mockito)的库,它允许模拟静态方法、构造函数、final类和方法,以及删除静态初始化器。这对于测试那些难以模拟的代码场景特别有用。 5. **...

    软件测试 src

    在测试这些源代码时,开发者可能会使用各种测试工具和技术,比如Mockito进行模拟对象测试,PowerMock用于模拟静态方法或final类,TestNG或Junit作为测试框架,还有像是JaCoCo用于代码覆盖率分析,SonarQube进行代码...

    java代码-TestStack

    3. **PowerMock**: 当标准的Mocking库无法满足需求时,PowerMock作为一个扩展库,可以模拟静态方法、构造函数、final类和方法、删除静态初始化器等。在某些特定情况下,PowerMock能帮助我们测试那些通常难以测试的...

    flgitee-test-master_java_

    3. 使用PowerMock等库进行的静态方法或构造器测试,因为它们通常不易于测试。 4. 配置文件,如TestNG的xml配置文件,用于定义测试套件和执行顺序。 5. 可能还有测试报告生成器,如JunitXmlReporter,用于生成XML格式...

    基于Java探针的Mock框架.zip

    例如,JProfiler、VisualVM和YourKit等是常见的Java探针工具,它们提供了丰富的视图和报告来帮助开发者优化应用性能。 然后,让我们探讨Mock框架。在软件开发中,单元测试是确保代码质量的关键步骤。Mock框架如...

    java 细节代码收集 供自己查看

    首先,`Test.java` 是一个常见的Java测试类文件名,通常用于进行单元测试或集成测试。在Java中,我们经常使用JUnit框架来进行测试,它可以验证我们的代码是否按照预期工作。通过编写测试用例,我们可以确保修改不会...

    junit4单元测试实例

    在JUnit4中,测试类通常继承自`org.junit.Test`,但更常见的是使用注解来定义测试方法。下面是一个简单的例子: ```java import org.junit.*; public class CalculatorTest { @Before public void setUp() { //...

Global site tag (gtag.js) - Google Analytics