基于PowerMokito的单测

1.接入pom
      <!--测试包-->
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <version>1.10.19</version>
            <scope>test</scope>
        </dependency>
        <!-- PowerMock  -->
        <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>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>4.3.4.RELEASE</version>
            <scope>test</scope>
        </dependency>
2.新建单测类
    import org.mockito.Mock;
    import org.mockito.MockitoAnnotations;
    import org.powermock.api.mockito.PowerMockito;
    import org.powermock.core.classloader.annotations.PrepareForTest;
    import org.powermock.modules.junit4.PowerMockRunner;
    import static org.mockito.Matchers.anyInt;
    import static org.mockito.Matchers.anyList;
    import static org.mockito.Matchers.anyString;
    @RunWith(PowerMockRunner.class)
    @PrepareForTest({ 测试类1.class, 测试类2.class,... })
    public class XXXTest {
    }
3.mock静态类
    PowerMockito.mockStatic(静态类.class);
      PowerMockito.when(静态类.静态方法(参数)).thenReturn(mock对象);
4.mock方法中有新建对象的操作
      PowerMockito.whenNew(新建类.class).withArguments(mock构造方法参数).thenReturn(mock新建类实例);
5.mock对外调用方法
    PowerMockito.when(mock对外依赖类实例.依赖方法(自己构造的参数,anyString(), anyInt(), anyLong(),...)).thenReturn(理想值);
6.预初始化

    @Before
    public void before() {
        MockitoAnnotations.initMocks(this);
        spyClient = PowerMockito.mock(TransportClient.class);
    }

踩到的坑:
1.在when里面设定带有参数的方法,且这个参数依赖于待测方法的入参,那么这两个参数必须是同一个对象,才能触发mock里面thenReturn()中的对象;
举例:
PowerMockito.mockStatic(IndexFactory.class);
PowerMockito.when(IndexFactory.getEsTransportClient(getClientNodes())).thenReturn(spyClient);
EsEasyClient easyClient = new EsEasyClient(getClientNodes());
public EsEasyClient(List<EsTransportClientNode> nodes) {
        transportClient = IndexFactory.getEsTransportClient(nodes);
}
这个时候,拿到的transportClient就是null;
需要新建一个对象统一入参,才能获取到mock的spyClient;
List<EsTransportClientNode> nodes = getClientNodes();
PowerMockito.when(IndexFactory.getEsTransportClient(nodes)).thenReturn(spyClient);
EsEasyClient easyClient = new EsEasyClient(nodes);
public EsEasyClient(List<EsTransportClientNode> nodes) {
        transportClient = IndexFactory.getEsTransportClient(nodes);
}
 

猜你喜欢

转载自blog.csdn.net/my201110lc/article/details/82229653