• PowerMock学习(十)之Mock spy的使用


    前言

    回顾下之前学过的内容,会发现一点,如果在mock后不写when和thenReturn去指定,即便是mock调用任何方法,什么也不会做,也看不到什么效果。

    划重点的时候来了,本身mock出来的对象是假的,再调用它的方法,一直都在“造假”。总结来说,就是一切都是假的,应了光良老师的那首歌,“童话里都是骗人的”。

    模拟场景

    service中有一个写数据到文件的方法

    service层

    具体代码如下:

    package com.rongrong.powermock.spies;
    
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileWriter;
    import java.io.IOException;
    
    /**
     * @description:
     * @author rongrong
     * @version 1.0
     * @date 2019/12/4 22:45
     */
    public class FileService {
    
        /**
         * 写入文件及数据操
         * @param text
         */
        public void writeData(String text){
            BufferedWriter bw = null;
            try {
                bw=new BufferedWriter(new FileWriter(System.getProperty("user.dir")+"/ronngrong.txt"));
                bw.write(text);
                bw.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                if(bw!=null){
                    try {
                        bw.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    为了模拟调用方法后,啥也没没做这个现象,使用之前学过的方法,这里我们不指定返回值(不加when和thenReturn),即人为干预

    复现代码

    使用之前学过的方法测试,具体示例代码如下:

        @Test
        public void testFileService(){
            FileService fileService = PowerMockito.mock(FileService.class);
            fileService.writeData("hellow,rongrong!!");
        }

    运行结果如下图,并没有新文件生成,更别说写入内容了

    使用powerMock进行测试

    采用 spy 的方式 mock一个对象,然后再调用其中的某个方法,它就会根据真实class 的所提供的方法来调用,具体示例代码如下:
     @Test
        public void testFileServiceWithSpy(){
            FileService fileService = PowerMockito.spy(new FileService());
            File file = new File(System.getProperty("user.dir") + "/ronngrong.txt");
            fileService.writeData("hellow,RongRong!!");
            assertTrue(file.exists());
        }

     直接运行这个测试用例,你会发现在项目根目录下生成了一个新文件,并且里面写入我们预期设定的内容,运行结果如下图:

     再来一看,最起码我们运行能看到效果,即我知道调用方法后干了些什么!!

  • 相关阅读:
    设计模式之单例模式
    消息队列的使用场景,技术选型和优缺点
    Flink本地Idea调试源码环境搭建
    Spark3.0中的AQE和DPP
    Flink源码DataStream
    How Do Vision Transformers Work?[2202.06709] 论文研读系列(2) 个人笔记
    SQL相关知识
    单点登录的三种实现方式
    类加载常见错误
    基本数据类型占的位数
  • 原文地址:https://www.cnblogs.com/longronglang/p/11986572.html
Copyright © 2020-2023  润新知