前言
回顾下之前学过的内容,会发现一点,如果在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());
}
直接运行这个测试用例,你会发现在项目根目录下生成了一个新文件,并且里面写入我们预期设定的内容,运行结果如下图:
再来一看,最起码我们运行能看到效果,即我知道调用方法后干了些什么!!