美文网首页
PowerMock简介

PowerMock简介

作者: 一路花开_8fab | 来源:发表于2019-04-18 15:32 被阅读0次

PowerMock扩展自Mockito,通过Java反射机制解决Mockito的一些问题,比如:在模拟final,static或者private方法上的不足。

1. Maven依赖

<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-module-junit4</artifactId>
    <version>1.6.4</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-mockito</artifactId>
    <version>1.6.4</version>
    <scope>test</scope>
</dependency>

为了使用PowerMockito,我们需要在被测试类上添加以下两个注解

@RunWith(PowerMockRunner.class)
@PrepareForTest(fullyQualifiedNames = "com.baeldung.powermockito.introduction.*")

@PrepareForTest注解中的fullyQualifiedNames代表一组我们想要mock的类的全限定名。在上面的例子中,我们使用了带有通配符的包名,这样,PowerMockito就会准备好com.baeldung.powermockito.introduction包下的所有的类,使他们可以用来mock。

2. 模拟构造器和final方法

本节,我们展示在使用new操作符实例化类时,如何得到一个mock对象,而非真实的对象,并使用mock对象来模拟final方法。

public class CollaboratorWithFinalMethods {
    public final String helloMethod() {
        return "Hello World!";
    }
}

调用无参构造器,返回mock对象

CollaboratorWithFinalMethods mock = mock(CollaboratorWithFinalMethods.class);
whenNew(CollaboratorWithFinalMethods.class).withNoArguments().thenReturn(mock);
CollaboratorWithFinalMethods collaborator = new CollaboratorWithFinalMethods();
verifyNew(CollaboratorWithFinalMethods.class).withNoArguments();

调用final方法

when(collaborator.helloMethod()).thenReturn("Hello Baeldung!");
String welcome = collaborator.helloMethod();
Mockito.verify(collaborator).helloMethod();
assertEquals("Hello Baeldung!", welcome);

3. 模拟static方法

public class CollaboratorWithStaticMethods {
    public static String firstMethod(String name) {
        return "Hello " + name + " !";
    }
 
    public static String secondMethod() {
        return "Hello no one!";
    }
 
    public static String thirdMethod() {
        return "Hello no one again!";
    }
}

为了模拟static方法,需要使用mockStatic注册类

    mockStatic(CollaboratorWithStaticMethods.class);

完整的测试代码如下

    @Test(expected = RuntimeException.class)
    public void givenStaticMethods_whenUsingPowerMockito_thenCorrect() {
        mockStatic(CollaboratorWithStaticMethods.class);

        when(CollaboratorWithStaticMethods.firstMethod(Mockito.anyString())).thenReturn("Hello Baeldung!");
        when(CollaboratorWithStaticMethods.secondMethod()).thenReturn("Nothing special");
        when(CollaboratorWithStaticMethods.thirdMethod()).thenThrow(RuntimeException.class);

        String firstWelcome = CollaboratorWithStaticMethods.firstMethod("Whoever");
        String secondWelcome = CollaboratorWithStaticMethods.firstMethod("Whatever");

        assertEquals("Hello Baeldung!", firstWelcome);
        assertEquals("Hello Baeldung!", secondWelcome);

        verifyStatic(times(2));
        CollaboratorWithStaticMethods.firstMethod(Mockito.anyString());

        verifyStatic(Mockito.never());
        CollaboratorWithStaticMethods.secondMethod();

        CollaboratorWithStaticMethods.thirdMethod();
    }

注意:verifyStatic()要在具体要校验的方法前面

4. 局部校验

public class CollaboratorForPartialMocking {
    public static String staticMethod() {
        return "Hello Baeldung!";
    }
 
    public final String finalMethod() {
        return "Hello Baeldung!";
    }
 
    private String privateMethod() {
        return "Hello Baeldung!";
    }
 
    public String privateMethodCaller() {
        return privateMethod() + " Welcome to the Java world.";
    }
}

4.1 局部模拟static方法

我们使用spy(XXX.class)来局部模拟CollaboratorForPartialMocking类,并为static方法设置预期

spy(CollaboratorForPartialMocking.class);
when(CollaboratorForPartialMocking.staticMethod()).thenReturn("I am a static mock method.");

校验如下

returnValue = CollaboratorForPartialMocking.staticMethod();
verifyStatic();
CollaboratorForPartialMocking.staticMethod();
assertEquals("I am a static mock method.", returnValue);

4.2 局部模拟final和private方法

我们使用spy(object)来局部模拟CollaboratorForPartialMocking对象

CollaboratorForPartialMocking collaborator = new CollaboratorForPartialMocking();
CollaboratorForPartialMocking mock = spy(collaborator);

final方法

when(mock.finalMethod()).thenReturn("I am a final mock method.");
returnValue = mock.finalMethod();
verify(mock,times(3)).finalMethod();
assertEquals("I am a final mock method.", returnValue);

private方法

when(mock, "privateMethod").thenReturn("I am a private mock method.");
returnValue = mock.privateMethodCaller();
verifyPrivate(mock).invoke("privateMethod");
assertEquals("I am a private mock method. Welcome to the Java world.", returnValue);

与final方法不同的是,private方法无法直接被调用。PowerMock使用privateMethodCaller作为代理,调用被测试类的private方法。

完整的测试代码如下:

    @Test
    public void givenPartialMocking_whenUsingPowerMockito_thenCorrect() throws Exception {
        String returnValue;

        spy(CollaboratorForPartialMocking.class);
        when(CollaboratorForPartialMocking.staticMethod()).thenReturn("I am a static mock method.");
        returnValue = CollaboratorForPartialMocking.staticMethod();
        verifyStatic();
        CollaboratorForPartialMocking.staticMethod();
        assertEquals("I am a static mock method.", returnValue);

        CollaboratorForPartialMocking collaborator = new CollaboratorForPartialMocking();
        CollaboratorForPartialMocking mock = spy(collaborator);

        when(mock.finalMethod()).thenReturn("I am a final mock method.");
        returnValue = mock.finalMethod();
        verify(mock,times(3)).finalMethod();
        assertEquals("I am a final mock method.", returnValue);

        when(mock, "privateMethod").thenReturn("I am a private mock method.");
        returnValue = mock.privateMethodCaller();
        verifyPrivate(mock).invoke("privateMethod");
        assertEquals("I am a private mock method. Welcome to the Java world.", returnValue);
    }

相关文章

  • PowerMock简介

      Java单元测试框架主要有JUnit和TestNG,常用的Mock框架主要有EasyMock、Mockito和...

  • PowerMock简介

    PowerMock扩展自Mockito,通过Java反射机制解决Mockito的一些问题,比如:在模拟final,...

  • PowerMock 笔记

    PowerMock 简介 PowerMock 是一个框架,它以更强大的功能扩展了其他模拟库,如 EasyMock ...

  • PowerMock原理及样例代码

    一、PowerMock简介 PowerMock 也是一个单元测试模拟框架,它是在其它单元测试模拟框架的基础上做出的...

  • UT和PowerMock

    PowerMock 简介 要测试的方法会引用很多外部依赖的对象(获得连接getConnection,getAdmi...

  • Android 单元测试 PowerMock框架的使用总结

    在安卓中我们常用Junit + Mockito + PowerMock 组合进行测试。PowerMock是拓展Mo...

  • PowerMock单元模拟测试框架简介

    一 为什么需要模拟测试单元框架 1 实际工作中会出现当对某个功能单元测试时,需要依赖其他服务,而这些服务例如第三方...

  • powermock单元测试问题

    覆盖率为0 powermock与jacoco结合后覆盖率为0,可以借助powermock离线模式 jacoco-m...

  • junit 单元测试

    采用 Junit + Mockito+ PowerMock 来实现

  • Android单元测试(五):PowerMock

    简介 PowerMock 也是一个单元测试模拟框架,它是在其它单元测试模拟框架的基础上做出的扩展。通过提供定制的类...

网友评论

      本文标题:PowerMock简介

      本文链接:https://www.haomeiwen.com/subject/etyzwqtx.html