美文网首页
单元测试-PowerMockito的使用(1)-mock初体验

单元测试-PowerMockito的使用(1)-mock初体验

作者: 残冬十九 | 来源:发表于2020-06-12 07:30 被阅读0次

    @TOC

    前言

    今天讲一下Mock的工具,PowerMockito,用来对我们的代码进行测试。

    一、为什么测试的时候使用Mock

    为什么要使用Mock呢,因为我们在进行单元测试的时候,好多地方需要引用外部对象,但我们又不不可控这些对象,所以为了解决这个问题,我们要使用Mock来解决,Mock可以模拟这写外部对象,来满足我们各种的测试条件。

    二、PowerMockito的使用

    Mock普通方法

    测试目标代码。最普通的一个方法。

    /**
     * @version 1.0
     * @Description mock示例
     * @Author 残冬十九
     * @Date 2020/6/3
     */
    public class MockDemo {
    
        /**
         * 加法,求两数之和
         * @param a 数值A
         * @param b 数值B
         * @return 两数之和
         */
        public int addition(int a, int b) {
            return a + b;
        }
    }
    

    1.1 断言错误实现

    测试用例代码(一)

    /**
     * @version 1.0
     * @Description mock测试类
     * @Author 残冬十九
     * @Date 2020/6/3
     */
    public class MockDemoTest extends TestCase {
    
        public void testAddition() {
            //mock一个需要测试的对象
            MockDemo mockDemo = mock(MockDemo.class);
            //填写我们的测试条件,如下,当a=1,b=2的时候,调用加法方法返回2,其他时候返回0
            when(mockDemo.addition(1, 2)).thenReturn(2);
            //下面进行断言,当mockDemo.addition返回2的时候继续往下执行,相反则中断退出
            Assert.assertEquals(2, mockDemo.addition(1, 1));
            System.out.println("MockDemoTest结束");
    
        }
    }
    

    可以根据代码看到,我们最终的断言是判断加法返回的是否是等于2,根据普通代码所看,最终是返回的2,但是我们mock了一个测试的对象出来,结果就不是普通方法执行的结果了

    运行结果


    mock测试结果

    从上图结果中可以看出,我们期待的结果是2,但实际返回的结果是0,因为我们使用了mock对象,并且设置了条件,当a=1,b=2的时候才会返回2,其他则返回0,我们传入的a=1,b=1明显不满足设置的预期条件,所以返回0,此时断言失败。

    1.2 断言成功

    /**
     * @version 1.0
     * @Description mock测试类
     * @Author 残冬十九
     * @Date 2020/6/3
     */
    public class MockDemoTest extends TestCase {
    
        public void testAddition() {
            //mock一个需要测试的对象
            MockDemo mockDemo = mock(MockDemo.class);
            //填写我们的测试条件,如下,当a=1,b=2的时候,调用加法方法返回2,其他时候返回0
            when(mockDemo.addition(1, 2)).thenReturn(2);
            //下面进行断言,当mockDemo.addition返回2的时候继续往下执行,相反则中断退出
            Assert.assertEquals(2, mockDemo.addition(1, 2));
            System.out.println("MockDemoTest结束");
    
        }
    }
    

    这次用设定的条件进行传值


    mock测试结果

    从这个结果中可以看出,我们断言的结果是正确的的,因为使用了指定的条件,返回了指定的值。

    1.3 扩展方法

        public void testAdditionV2() {
            //mock一个需要测试的对象
            MockDemo mockDemo = mock(MockDemo.class);
            //填写我们的测试条件,如下,当a=1,b=2的时候,调用加法方法返回2,其他时候返回0
            when(mockDemo.addition(1, 2)).thenReturn(2);
            System.out.println("when(mockDemo.addition(1, 2)).thenReturn(2):
            + mockDemo.addition(1, 2)===" + mockDemo.addition(1, 2));
            //如果使用了anyInt()的测试条件,就代表任何数据都可以满足条件。
            when(mockDemo.addition(anyInt(), anyInt())).thenReturn(2);
            System.out.println("when(mockDemo.addition(anyInt(), anyInt()))
            .thenReturn(2):mockDemo.addition(1, 2)===" + mockDemo.addition(1, 2));
            //如果不想同模拟的返回值,而是用真实的返回值的话,就是用thenCallRealMethod放。
            when(mockDemo.addition(anyInt(), anyInt())).thenCallRealMethod();
            System.out.println("when(mockDemo.addition(anyInt(), anyInt())).
            thenCallRealMethod():mockDemo.addition(1, 2)===" + mockDemo.addition(1, 2));
    
        }
    
    mock结果

    从上图可以看出我们几种测试条件,指定参数的条件,通配的条件,指定的返回值,原本方法的返回值,这些都是可以灵活使用配置的。

    相关文章

      网友评论

          本文标题:单元测试-PowerMockito的使用(1)-mock初体验

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