Powermock 扩展于EasyMock和Mockito,而Mockito相对于EasyMock的优点其中一个是异常更清晰易懂。
现在用的是基于Mockito的Powermock,它可以mock静态方法,mock构造函数,mock void方法,mock部分方法,mock私有方法等。以下是如果使用基于Mockito的Powermock版本。
1.导入包
其中 <powermock.version>1.6.3</powermock.version>
<dependency> <groupId>org.powermock</groupId> <artifactId>powermock-module-junit4</artifactId> <version>${powermock.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-easymock</artifactId> <version>${powermock.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-mockito</artifactId> <version>${powermock.version}</version> <scope>test</scope> </dependency>
假设我们需要测试下面的Hello类
class Hi { public void mockParentMethod() { System.out.println("mockSuperMethod Hi"); } } class Hello extends Hi { private Kitty kitty; public Hello() {} public void mockParentMethod() { super.mockParentMethod(); System.out.println("mockParentMethod Hello"); } public void mockNonStaticMethod() { String name = kitty.getName(); System.out.println("mockNonStaticMethod" + name); } public void mockStaticMethod() { String name = Kitty.getName2(); System.out.println("mockStaticMethod" + name); } public void partialMock() { _partialMock(); System.out.println("partialMock"); } private void _partialMock() { System.out.println("method3"); } public void mockVoidMethod() { kitty.say3(); System.out.println("partialMock"); } public Kitty getKitty() { return kitty; } public void setKitty(Kitty kitty) { this.kitty = kitty; } } class Kitty { public String getName() { return "Kitty"; } public static String getName2() { return "Kitty"; } public void say3() { System.out.println("say3"); } }
2. 导入声明
测试类时,要导入以下声明:
@RunWith(PowerMockRunner.class) public class HelloTest { }
3. 测试方法
3.1 mock 非静态方法
@Test public void testMockNonStaticMethod() { Hello hello = new Hello(); Kitty kitty = PowerMockito.mock(Kitty.class); hello.setKitty(kitty); PowerMockito.when(kitty.getName()).thenReturn("test"); hello.mockNonStaticMethod(); }
3.2 mock 静态方法
首先需要PrepareForTest导入静态方法的类
@RunWith(PowerMockRunner.class) @PrepareForTest({Kitty.class}) class HelloTest { @Test public void testMockStaticMethod() { Hello hello = new Hello(); PowerMockito.mockStatic(Kitty.class); PowerMockito.when(Kitty.getName2()).thenReturn("test"); hello.mockStaticMethod(); } }
3.3 partial mock (mock 部分方法)
如果只想mock一个类里面的个别方法,可以使用spy方法
@RunWith(PowerMockRunner.class) @PrepareForTest({Hello.class}) public class HelloTest { @Test public void testPartialMock() { Hello hello = PowerMockito.spy(new Hello()); try { PowerMockito.doReturn("test").when(hello, MemberMatcher.method(Hello.class, "_partialMock")).withNoArguments(); } catch (Exception e) { e.printStackTrace(); } hello.partialMock(); } }
3.4 mock void 方法
@Test public void testMockVoidMethod() { Hello hello = new Hello(); Kitty kitty = PowerMockito.mock(Kitty.class); hello.setKitty(kitty); PowerMockito.doNothing().when(kitty).say3(); hello.mockVoidMethod(); }
3.5 mock parent method (父类方法)
使用PowerMockito.suppress()方法
@Test public void testMockParentMethod() { Hello hello = new Hello(); PowerMockito.suppress(MemberMatcher.methodsDeclaredIn(Hi.class)); hello.testMockParentMethod(); }
不过这个版本好像有个bug,如果用了spy mock 子类,当子类方法里面调了父类的两次(或以上)相同或者不相同的方法时,测试子类的方法会报StackOverflowError异常,如下面的子类方法:
public void mockParentMethod() { super.mockParentMethod(); //一次 System.out.println("mockParentMethod Hello"); super.mockParentMethod(); //两次 }
@Test public void testMockParentMethod() { Hello hello = PowerMockito.spy(new Hello()); PowerMockito.suppress(MemberMatcher.methodsDeclaredIn(Hi.class)); hello.testMockParentMethod(); // throw StackOverflowError exception }
3.6 测试私有方法
格式: PowerMockito.verifyPrivate(objectOrClassToInvoke).invoke("methodToBeTest", parms);
public void testPrivateMethod() { Hello hello = new Hello(); PowerMockito.verifyPrivate(hello).invoke("_partialMock"); }
或者使用 WhiteBox.invokeMethod() 方法。
3.6 mock构造函数
使用 PowerMockito.whenNew() 方法
Hello hello = PowerMockito.mock(Hello.class) PowerMockito.whenNew(Hello.class).thenReturn(hello);
相关链接
powermock官网:https://github.com/jayway/powermock
相关推荐
总的来说,Java单元测试结合JUnit、PowerMock和Mockito,以及Eclipse插件,为开发者提供了一个强大的测试环境,能够有效地测试代码的各个部分,确保软件的质量和稳定性。正确地理解和使用这些工具,将极大地提升你的...
第二步是在 src/test/java 下面创建测试用例,使用@RunWith(SpringRunner.class) 和 @SpringBootTest 注解来启用 Spring 测试环境,然后使用内置的 mapper 接口方法,如 selectList 方法,来验证数据库操作的正确性...
Mockito 和 PowerMock 是 Java 开发中常用的单元测试框架,它们可以帮助开发者在测试代码时模拟复杂的依赖关系,以便更有效地进行隔离和验证。本项目,"MockitoExample",提供了这两个工具的实战示例,旨在帮助...
1. **JUnit介绍**:JUnit是一个基于Java的单元测试框架,它允许开发者编写可重复执行的测试用例,以确保代码在修改后仍然能够正常工作。JUnit 4.11是4.x系列的一个重要更新,引入了许多新特性和改进。 2. **主要...
在实际应用中,我们可以结合Mockito、PowerMock等工具进一步增强测试能力,例如模拟静态方法、私有方法或构造函数的行为。此外,还可以考虑使用持续集成工具(如Jenkins、Travis CI)自动化测试过程,确保每次代码...
此外,JUnit与其他工具如Mockito、PowerMock等集成,可实现更复杂的测试场景。 总结: JUnit4通过注解简化了单元测试的编写,提供了丰富的断言方法和运行时控制,使得测试更加灵活和高效。在实际开发中,熟练掌握...
【集成测试实战1】主要探讨的是在IT领域中进行集成测试时的技术选型和实践,特别是针对Mock框架的选择和使用。集成测试是为了确保各个组件在实际环境中的协同工作,通过模拟不可控组件来达到测试目的。 集成测试的...
在`junit_powermock-master`这个压缩包中,我们可以找到一个关于如何使用JUnit和PowerMock进行单元测试的示例项目。该项目可能包含以下组成部分: 1. **测试类**:这些类通常以`Test`结尾,包含了使用`@RunWith...
PowerMock是一个强大的Java单元测试框架,它扩展了其他Mocking库(如EasyMock)的功能,允许开发者模拟静态方法、构造函数、final类和方法、私有方法以及删除静态初始化器。这使得测试更加灵活,能够处理那些在传统...
实践层面,Android测试开发流程推荐使用Mockito进行单元测试,结合Espresso和UIAutomator进行UI测试。TDD强调先写测试,后写代码,通过mock减少模块间的依赖,推动面向接口编程。 最后,代码覆盖率是衡量测试全面性...
Mock框架如Mockito、EasyMock和PowerMock等,使得开发者可以在不依赖外部资源或复杂环境的情况下测试代码。它们可以创建模拟对象(mock objects)来代替真实的依赖,从而控制测试环境,验证方法调用,以及设置预期...
- **《单元测试之道 Java版——使用JUnit》**: 专门针对Java程序员介绍JUnit的使用技巧。 - **《软件测试的艺术》**: 综合性地介绍了软件测试的基本概念和技术。 - **《有效软件测试——提高测试水平的50条建议》**:...
在软件开发过程中,模拟(Mocking)是一种常用的技术,它允许开发者在测试代码时替代真实对象,以便专注于测试目标代码的行为。...对于想要深入学习Java测试或者对模拟技术感兴趣的开发者来说,这是一个宝贵的资源。
- Mockito或PowerMock等工具辅助进行模拟对象测试。 9. **部署与运行环境** - 应用服务器如Tomcat、Jetty或WildFly承载应用运行。 - 数据库服务器如MySQL、Oracle或PostgreSQL存储系统数据。 10. **人力资源...
《Android测试开发--基于Java编程语言技术体系》 基于Java编程语言,帮你构建Android测试开发技术体系。 前言: 本书(项目)定位是面向 android测试开发 或 android开发 人员。 自动化测试开发基础 什么是测试开发...
1. **JUnit**: JUnit是Java编程语言中最广泛使用的单元测试框架。它允许开发者编写可重复运行的测试用例,以验证代码的各个单元(函数或方法)是否按预期工作。JUnit支持注解、测试套件、参数化测试等多种特性,提高...
首先,`Test.java` 是一个常见的Java测试类文件名,通常用于进行单元测试或集成测试。在Java中,我们经常使用JUnit框架来进行测试,它可以验证我们的代码是否按照预期工作。通过编写测试用例,我们可以确保修改不会...