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());
    }

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

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

原文地址:https://www.cnblogs.com/longronglang/p/11986572.html