java mock

一、Mock静态块,静态变量,普通方法

1.准备工作

jar包版本最好保持一致

<dependency>
	<groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>1.10.19</version>
</dependency>
<dependency>
    <groupId>org.jmockit</groupId>
    <artifactId>jmockit</artifactId>
    <version>1.16</version>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>

开始用的jmockit-1.41.jar,就执行测试案例的时候失败了
在这里插入图片描述

2.mock静态块和静态变量

需要调用的类:


public class SomeMethods {
    public static String a = "我是静态变量";
    static{
        System.out.println("执行静态块...");
    }
    public static String sayHello(String name){
        System.out.println("执行静态方法...");
        return "Hello! " + name;
    }
    public String sayHi(String name){
        System.out.println("执行普通方法...");
        return "Hi! " + name;
    }
}

需要测试的类:

public class MockDemo {
    public void method1(){
        SomeMethods someMethods = new SomeMethods();
        System.out.println("静态变量a的值:" + SomeMethods.a);
        System.out.println("method1执行结束...");
    }
}

直接执行method1,结果:
在这里插入图片描述

使用MockUp + @Mock 可以mock掉目标类的静态块,不执行静态块,反而在类初始化的时候执行$clinit()方法,而且,也可以给静态变量赋值。

测试类代码:

public class MockDemoTest {

    @Before
    public void init(){
        new MockUp<SomeMethods>(SomeMethods.class){
            /**
             * clinit是jvm用来初始化静态变量和静态块的方法
             */
            @Mock
            void $clinit() {
                System.out.println("MockUp代替静态执行...");
                SomeMethods.a = "我是Mock之后的静态变量";
            }
        };
    }

    /**
     * method1方法会执行SomeMethods的静态块,也会加载静态变量
     */
    @Test
    public void testMethod1(){
        MockDemo mockDemo = new MockDemo();
        mockDemo.method1();
        Assert.assertEquals("","");
    }
}

执行结果:
在这里插入图片描述

3.mock普通方法

需要调用的类:

public class SomeMethods {

    public static String a = "我是静态变量";
    static{
        System.out.println("执行静态块...");
    }
    public static String sayHello(String name){
        System.out.println("执行静态方法...");
        return "Hello! " + name;
    }
    public String sayHi(String name){
        System.out.println("执行普通方法...");
        return "Hi! " + name;
    }

}

需要测试的类:

public class MockDemo {

    public void method1(){
        SomeMethods someMethods = new SomeMethods();
        System.out.println("调用普通方法返回的值:" + someMethods.sayHi("zhj"));
        System.out.println("静态变量a的值:" + SomeMethods.a);
        System.out.println("method1执行结束...");
    }
}

调用method1,结果:
在这里插入图片描述

测试代码:

public class MockDemoTest {

    @Before
    public void init(){
        new MockUp<SomeMethods>(SomeMethods.class){
            /**
             * clinit是jvm用来初始化静态变量和静态块的方法
             */
//            @Mock
//            void $clinit() {
//                System.out.println("MockUp代替静态执行...");
//                SomeMethods.a = "我是Mock之后的静态变量";
//            }
            @Mock
            public String sayHi(String name){
                System.out.println("执行Mock的普通方法...");
                return "Mock! " + name;
            }
        };
    }

    /**
     * method1方法会执行SomeMethods的静态块,也会加载静态变量
     */
    @Test
    public void testMethod1(){
        MockDemo mockDemo = new MockDemo();
        mockDemo.method1();
        Assert.assertEquals("","");
    }
}

执行测试代码结果:
在这里插入图片描述

二、Mock静态方法

1.准备工作

依赖jar包:

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

2.mock静态方法

调用静态方法的代码:

public void method2(){
    System.out.println("调用静态方法返回的值:" + SomeMethods.sayHello("zhj"));
    System.out.println("method2执行结束...");
}

静态方法:

public static String sayHello(String name){
   System.out.println("执行静态方法...");
   return "Hello! " + name;
}

执行结果:
在这里插入图片描述
测试类代码:

@RunWith(PowerMockRunner.class)
@PrepareForTest({SomeMethods.class})
public class MockDemoTest2 {

    /**
     * method2方法会调用SomeMethods的静态方法
     */
    @Test
    public void testMethod2(){
        PowerMockito.mockStatic(SomeMethods.class);
        PowerMockito.when(SomeMethods.sayHello(Mockito.anyString())).thenReturn("我是Mock后静态方法的返回值");
        MockDemo mockDemo = new MockDemo();
        mockDemo.method2();
        Assert.assertEquals("","");
    }
}

执行测试代码,结果:
在这里插入图片描述


版权声明:本文为m0_37840862原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。