`
susiya
  • 浏览: 91114 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java单元测试--基于Mockito的PowerMock使用

 
阅读更多

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

 

1
0
分享到:
评论

相关推荐

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

    总的来说,Java单元测试结合JUnit、PowerMock和Mockito,以及Eclipse插件,为开发者提供了一个强大的测试环境,能够有效地测试代码的各个部分,确保软件的质量和稳定性。正确地理解和使用这些工具,将极大地提升你的...

    MyBatis-Plus 如何单元测试的实现

    第二步是在 src/test/java 下面创建测试用例,使用@RunWith(SpringRunner.class) 和 @SpringBootTest 注解来启用 Spring 测试环境,然后使用内置的 mapper 接口方法,如 selectList 方法,来验证数据库操作的正确性...

    MockitoExample:Mockito 和 PowerMock 的示例项目

    Mockito 和 PowerMock 是 Java 开发中常用的单元测试框架,它们可以帮助开发者在测试代码时模拟复杂的依赖关系,以便更有效地进行隔离和验证。本项目,"MockitoExample",提供了这两个工具的实战示例,旨在帮助...

    junit4.11单元测试

    1. **JUnit介绍**:JUnit是一个基于Java的单元测试框架,它允许开发者编写可重复执行的测试用例,以确保代码在修改后仍然能够正常工作。JUnit 4.11是4.x系列的一个重要更新,引入了许多新特性和改进。 2. **主要...

    spring MVC junit 单元测试(controller)

    在实际应用中,我们可以结合Mockito、PowerMock等工具进一步增强测试能力,例如模拟静态方法、私有方法或构造函数的行为。此外,还可以考虑使用持续集成工具(如Jenkins、Travis CI)自动化测试过程,确保每次代码...

    junit4单元测试实例

    此外,JUnit与其他工具如Mockito、PowerMock等集成,可实现更复杂的测试场景。 总结: JUnit4通过注解简化了单元测试的编写,提供了丰富的断言方法和运行时控制,使得测试更加灵活和高效。在实际开发中,熟练掌握...

    2.集成测试实战1

    【集成测试实战1】主要探讨的是在IT领域中进行集成测试时的技术选型和实践,特别是针对Mock框架的选择和使用。集成测试是为了确保各个组件在实际环境中的协同工作,通过模拟不可控组件来达到测试目的。 集成测试的...

    junit_powermock:一种简单的 JUnit 单元测试方法,以及 Powermock 的使用

    在`junit_powermock-master`这个压缩包中,我们可以找到一个关于如何使用JUnit和PowerMock进行单元测试的示例项目。该项目可能包含以下组成部分: 1. **测试类**:这些类通常以`Test`结尾,包含了使用`@RunWith...

    powermock实战手册

    PowerMock是一个强大的Java单元测试框架,它扩展了其他Mocking库(如EasyMock)的功能,允许开发者模拟静态方法、构造函数、final类和方法、私有方法以及删除静态初始化器。这使得测试更加灵活,能够处理那些在传统...

    深入浅出Android 自动化测试1

    实践层面,Android测试开发流程推荐使用Mockito进行单元测试,结合Espresso和UIAutomator进行UI测试。TDD强调先写测试,后写代码,通过mock减少模块间的依赖,推动面向接口编程。 最后,代码覆盖率是衡量测试全面性...

    基于Java探针的Mock框架.zip

    Mock框架如Mockito、EasyMock和PowerMock等,使得开发者可以在不依赖外部资源或复杂环境的情况下测试代码。它们可以创建模拟对象(mock objects)来代替真实的依赖,从而控制测试环境,验证方法调用,以及设置预期...

    开源测试技术.pdf

    - **《单元测试之道 Java版——使用JUnit》**: 专门针对Java程序员介绍JUnit的使用技巧。 - **《软件测试的艺术》**: 综合性地介绍了软件测试的基本概念和技术。 - **《有效软件测试——提高测试水平的50条建议》**:...

    此资源包含4种mock源码

    在软件开发过程中,模拟(Mocking)是一种常用的技术,它允许开发者在测试代码时替代真实对象,以便专注于测试目标代码的行为。...对于想要深入学习Java测试或者对模拟技术感兴趣的开发者来说,这是一个宝贵的资源。

    Java人力资源管理系统源码.rar

    - Mockito或PowerMock等工具辅助进行模拟对象测试。 9. **部署与运行环境** - 应用服务器如Tomcat、Jetty或WildFly承载应用运行。 - 数据库服务器如MySQL、Oracle或PostgreSQL存储系统数据。 10. **人力资源...

    android-test-book

    《Android测试开发--基于Java编程语言技术体系》 基于Java编程语言,帮你构建Android测试开发技术体系。 前言: 本书(项目)定位是面向 android测试开发 或 android开发 人员。 自动化测试开发基础 什么是测试开发...

    元测单试jnuit spring

    1. **JUnit**: JUnit是Java编程语言中最广泛使用的单元测试框架。它允许开发者编写可重复运行的测试用例,以验证代码的各个单元(函数或方法)是否按预期工作。JUnit支持注解、测试套件、参数化测试等多种特性,提高...

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

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

Global site tag (gtag.js) - Google Analytics