关于Mock Answer

上一篇文章,有介绍过关于Arguments Matche的使用,其实 Answer的作用与其比较类似,但是它比 Arguments Matcher 更加强大。

Arguments Matche

即传入不同的参数,返回不同的结果,重在入参的判断,在入参重写方法去判断

Answer

见名知意,即返回不同的结果,但是根据传入参数去判断,在返回处重写方法去判断,返回结果

模拟场景

根据学生名字查找邮箱,controller调service层

service层

具体代码示例如下:
package com.rongrong.powermock.answers;

/**
* @author rongrong
* @version 1.0
* @description:
* @date 2019/12/4 20:24
*/
public class StudentAnswerService { public String getEmail(String userName){
throw new UnsupportedOperationException();
}
}

controller层

具体代码示例如下:

package com.rongrong.powermock.answers;

/**
* @author rongrong
* @version 1.0
* @description:
* @date 2019/12/4 20:24
*/
public class StudentController { public String getEmail(String userName) {
StudentAnswerService studentAnswerService = new StudentAnswerService();
return studentAnswerService.getEmail(userName);
}
}

上面的代码的业务代码比较简单了,下面再来进行测试

具体示例代码如下:

package com.rongrong.powermock.answers;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner; import static junit.framework.TestCase.assertEquals;
import static junit.framework.TestCase.fail; /**
* @author rongrong
* @version 1.0
* @description:
* @date 2019/12/4 20:34
*/
@RunWith(PowerMockRunner.class)
//准备调用层的类
@PrepareForTest(StudentController.class)
public class TestStudentAnswerService { @Test
public void testStudentAnswerService() {
StudentAnswerService studentAnswerService = PowerMockito.mock(StudentAnswerService.class);
PowerMockito.when(studentAnswerService.getEmail(Mockito.anyString())).then(new Answer<String>() {
@Override
public String answer(InvocationOnMock invocation) throws Throwable {
String arg = (String) invocation.getArguments()[0];
if ("rr".equals(arg)) {
return "rongrong@qq.com";
} else if ("jqj".equals(arg)) {
return "jiuqujian@qq.com";
}
throw new NullPointerException();
}
});
try {
PowerMockito.whenNew(StudentAnswerService.class).withAnyArguments().thenReturn(studentAnswerService);
StudentController studentController = new StudentController();
String email = studentController.getEmail("rr");
assertEquals("rongrong@qq.com",email);
email = studentController.getEmail("jqj");
assertEquals("jiuqujian@qq.com",email);
email = studentController.getEmail("tony");
assertEquals("jiuqujian@qq.com",email);
} catch (Exception e) {
e.printStackTrace();
}
}
}

answer 接口中参数 InvocationOnMock使用

invocation.getArguments();(1)
invocation.callRealMethod();(2)
invocation.getMethod();(3)
invocation.getMock();(4)
(1)获取 mock 方法中传递的入参
(2)获取是那个真实的方法调用了该 mock 接口
(3)获取是那么 mock 方法被调用了
(4)获取被 mock 之后的对象

到此,关于mock中 Answer的使用介绍完,有兴趣的同学可以自己从上到下自己敲一遍。

PowerMock学习(九)之Mock Answer的使用的更多相关文章

  1. 简单介绍如何使用PowerMock和Mockito来mock 1. 构造函数 2. 静态函数 3. 枚举实现的单例 4. 选择参数值做为函数的返回值(转)

    本文将简单介绍如何使用PowerMock和Mockito来mock1. 构造函数2. 静态函数3. 枚举实现的单例4. 选择参数值做为函数的返回值5. 在调用mock出来的方法中,改变方法参数的值 一 ...

  2. PowerMock学习之PoweMock的入门(二)

    前言 在上一篇<PowerMock学习之PoweMock的入门(一)>文章中,已经简单提及一些关于powermock的用法,但是入门还未完,我还要坚持把它学习并坚持更新到博客中. Mock ...

  3. PowerMock学习(一)之PoweMock的入门--模拟新增学生操作

    关于powermock 在TDD领域Mock框架有很多,比如EasyMock,JMock,Mockito.可能有些同学会好奇了,为什么要重点把powermock拿出来呢,因为powermock可以解决 ...

  4. PowerMock 支持gRPC的Mock Server实现

    PowerMock是一个Mock Server的实现,它同时支持HTTP与gRPC协议接口的Mock,并提供了灵活的插件功能. 这个工具面向于前后端.测试等对有接口Mock需求的开发人员,也可以作为一 ...

  5. PowerMock学习(十一)之Mock private methods的使用

    Mock  private methods 就是mock私有方法啦,学到这不难发现,我们其实大部分都是通过反射去完成单元测试的,但是在实际中,某个类中的私有方法,个人不建议使用反射来测试,因为有时候会 ...

  6. PowerMock学习(六)之Mock Final的使用

    Mock Final mockfinal相对来说就比较简单了,使用powermock来测试使用final修饰的method或class,比较简单,接口调用部分,还是service调用dao. 对于接口 ...

  7. PowerMock学习(八)之Mock Argument Matcher的使用

    前言 本计划在上周六日将powermock学完,并同步到博客中,结果自己没经得住诱惑,又开始去打王者荣耀了.虽然两天时间我从钻石一升到了星耀V四星,但是我并没有觉得很开心,相反很失落呢.不得不说腾讯的 ...

  8. PowerMock学习(三)之Mock局部变量

    编写powermock用例步骤: 类上面先写这两个注解@RunWith(PowerMockRunner.class).@PrepareForTest(StudentService.class) 先模拟 ...

  9. PowerMock学习(四)之Mock static的使用

    我们编写代码的时候,总会写一些工具类,为了方便调用喜欢使用static关键字来修饰对应方法. 那么现在举例说明,还是准备两个接口,第一个是查询学生总数,第二个是新增学生两个接口,具体示例代码如下: p ...

随机推荐

  1. linux安装redis 和 使用

    安装 .获取redis资源 wget http://download.redis.io/releases/redis-4.0.8.tar.gz .解压 .tar.gz .安装 cd redis- ma ...

  2. NodeJs 实现 WebSocket 即时通讯(版本一)

    服务端代码 var ws = require("nodejs-websocket"); console.log("开始建立连接...") var game1 = ...

  3. [考试反思]0921csp-s模拟测试49:困顿

    太弱.还是太弱. 拉不开分差,离第一机房分数线估计还是300多分. 但是,还是要骂:XX出题人. 部分分非常少且没有意义,T1基本只有0/纯暴力20/100三个档, T2正解是n2但是n3一分不给,还 ...

  4. introduce new products

    Today's the day. I'm giving you the heads up. Our company is rolling up its new line of cell phones. ...

  5. jquery.eraser制作擦涂效果

    jquery.eraser制作擦涂效果 <pre><!DOCTYPE html><html> <head> <meta http-equiv=&q ...

  6. 开启docker中的mongodb认证授权

    前言: 开启MongoDB服务后,默认是没有权限验证的.直接通过IP加端口就可以远程访问数据库,并对数据库进行任意操作.下面介绍一下如何开启docker中MongoDB的权限认证. 安装完MongoD ...

  7. (数据科学学习手札71)在Python中制作个性化词云图

    本文对应脚本及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 一.简介 词云图是文本挖掘中用来表征词频的数据可视化 ...

  8. activemq 的延迟队列和幂等性检查

    一. 延迟消息队列 1. 在提交支付之后,可以发送一个延迟检查的队列,来主动查询用户在支付宝上的支付状态 在mq的配置/config/activeMq.xml的broker实例上配置 schedule ...

  9. [Office] Resources for Office Development

    Office 2013 Document (.chm) download page: http://www.microsoft.com/en-us/download/details.aspx?id=4 ...

  10. nyoj 49-开心的小明(动态规划, 0-1背包问题)

    49-开心的小明 内存限制:64MB 时间限制:1000ms Special Judge: No accepted:7 submit:11 题目描述: 小明今天很开心,家里购置的新房就要领钥匙了,新房 ...