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