mock获取入参数并动态设置返回值
| /* | |
| * Copyright (c) 2007 Mockito contributors | |
| * This program is made available under the terms of the MIT License. | |
| */ | |
| package org.mockitousage.stubbing; | |
| import org.junit.Test; | |
| import org.mockito.Mock; | |
| import org.mockito.invocation.InvocationOnMock; | |
| import org.mockito.stubbing.Answer; | |
| import org.mockitousage.IMethods; | |
| import org.mockitoutil.TestBase; | |
| import java.lang.reflect.Method; | |
| import java.util.Set; | |
| import static org.junit.Assert.*; | |
| import static org.mockito.Mockito.*; | |
| public class StubbingWithCustomAnswerTest extends TestBase { | |
| @Mock | |
| private IMethods mock; | |
| @Test | |
| public void shouldAnswer() throws Exception { | |
| when(mock.simpleMethod(anyString())).thenAnswer(new Answer<String>() { | |
| public String answer(InvocationOnMock invocation) throws Throwable { | |
| String arg = invocation.getArgument(0); | |
| return invocation.getMethod().getName() + "-" + arg; | |
| } | |
| }); | |
| assertEquals("simpleMethod-test", mock.simpleMethod("test")); | |
| } | |
| @Test | |
| public void shouldAnswerWithThenAnswerAlias() throws Exception { | |
| RecordCall recordCall = new RecordCall(); | |
| Set<?> mockedSet = (Set<?>) when(mock(Set.class).isEmpty()).then(recordCall).getMock(); | |
| mockedSet.isEmpty(); | |
| assertTrue(recordCall.isCalled()); | |
| } | |
| @Test | |
| public void shouldAnswerConsecutively() throws Exception { | |
| when(mock.simpleMethod()) | |
| .thenAnswer(new Answer<String>() { | |
| public String answer(InvocationOnMock invocation) throws Throwable { | |
| return invocation.getMethod().getName(); | |
| } | |
| }) | |
| .thenReturn("Hello") | |
| .thenAnswer(new Answer<String>() { | |
| public String answer(InvocationOnMock invocation) throws Throwable { | |
| return invocation.getMethod().getName() + "-1"; | |
| } | |
| }); | |
| assertEquals("simpleMethod", mock.simpleMethod()); | |
| assertEquals("Hello", mock.simpleMethod()); | |
| assertEquals("simpleMethod-1", mock.simpleMethod()); | |
| assertEquals("simpleMethod-1", mock.simpleMethod()); | |
| } | |
| @Test | |
| public void shouldAnswerVoidMethod() throws Exception { | |
| RecordCall recordCall = new RecordCall(); | |
| doAnswer(recordCall).when(mock).voidMethod(); | |
| mock.voidMethod(); | |
| assertTrue(recordCall.isCalled()); | |
| } | |
| @Test | |
| public void shouldAnswerVoidMethodConsecutively() throws Exception { | |
| RecordCall call1 = new RecordCall(); | |
| RecordCall call2 = new RecordCall(); | |
| doAnswer(call1) | |
| .doThrow(new UnsupportedOperationException()) | |
| .doAnswer(call2) | |
| .when(mock).voidMethod(); | |
| mock.voidMethod(); | |
| assertTrue(call1.isCalled()); | |
| assertFalse(call2.isCalled()); | |
| try { | |
| mock.voidMethod(); | |
| fail(); | |
| } catch (UnsupportedOperationException e) { | |
| } | |
| mock.voidMethod(); | |
| assertTrue(call2.isCalled()); | |
| } | |
| @Test | |
| public void shouldMakeSureTheInterfaceDoesNotChange() throws Exception { | |
| when(mock.simpleMethod(anyString())).thenAnswer(new Answer<String>() { | |
| public String answer(InvocationOnMock invocation) throws Throwable { | |
| assertTrue(invocation.getArguments().getClass().isArray()); | |
| assertEquals(Method.class, invocation.getMethod().getClass()); | |
| return "assertions passed"; | |
| } | |
| }); | |
| assertEquals("assertions passed", mock.simpleMethod("test")); | |
| } | |
| private static class RecordCall implements Answer<Object> { | |
| private boolean called = false; | |
| public boolean isCalled() { | |
| return called; | |
| } | |
| public Object answer(InvocationOnMock invocation) throws Throwable { | |
| called = true; | |
| return null; | |
| } | |
| } | |
| } |
2. 当mock一个对象,且执行此对象中的方法没有返回值时,使用下面的方法:
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
类名 对象 = Mockito.mock(类名.class);
Mockito.doAnswer(new Answer<Object>() {
public Object answer(InvocationOnMock invocation) {
Object[] args = invocation.getArguments();
return "called with arguments: " + args;
}
}).when(对象).方法名();
---------------------
本文来自 flysun3344 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/flysun3344/article/details/52065492?utm_source=copy
mock获取入参数并动态设置返回值的更多相关文章
- 常量函数、常量引用参数、常量引用返回值[C++]
1. 关于常量引用正像在C语言中使用指针一样,C++中通常使用引用 有一个函数... foo()并且这个函数返回一个引用...... & foo()...., 一个指向位图(Bitmap)的引 ...
- 使用 ResponseBodyAdvice 拦截Controller方法默认返回参数,统一处理返回值/响应体
使用 @ControllerAdvice & ResponseBodyAdvice 拦截Controller方法默认返回参数,统一处理返回值/响应体 1.Controller代码 以下是Con ...
- day03 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数
本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 温故知新 1. 集合 主要作用: 去重 关系测 ...
- Java程序调用带参数的shell脚本返回值
Java程序调用带参数的shell脚本返回值 首先来看看linux中shell变量(\(#,\)@,$0,$1,\(2)的含义解释 变量说明: - \)$ Shell本身的PID(ProcessI ...
- JQuery/JS select标签动态设置选中值、设置禁止选择 button按钮禁止点击 select获取选中值
//**1.设置选中值:(根据索引确定选中值)**// var osel=document.getElementById("selID"); //得到select的ID var o ...
- c++11之获取模板函数的参数个数和函数返回值类型
本文演示c++需要支持c++11及以上标准 获取参数个数 1.模板函数声明 template <class R, class... Args> R getRetValue(R(*)(Arg ...
- c语言main函数返回值、参数详解(返回值是必须的,0表示正常退出)
C语言Main函数返回值 main函数的返回值,用于说明程序的退出状态.如果返回0,则代表程序正常退出:返回其它数字的含义则由系统决定.通常,返回非零代表程序异常退出. 很多人甚至市面上的一些书籍,都 ...
- c++特性:指向类成员的指针和非类型类模板参数和函数指针返回值 参数推导机制和关联型别
一.c++允许定义指向类成员的指针,包括类函数成员指针和类数据成员指针 格式如下: class A { public: void func(){printf("This is a funct ...
- [android] setOnTouchEvent 设置返回值为true 和 false的区别
今天在做自定义的可选文本的 TextView 类时,用到了 View 类的 setOnTouchListener(OnTouchListener l)事件监听,在构造 OnTouchListener ...
随机推荐
- JVM内存管理概述
1.概述 java不在需要开发人员显示的分配内存和回收内存,而是由JVM自动管理内存的分配和回收(又称为垃圾回收-GC),这简化了编程难度,但同时可能使得程序员在不知不觉中浪费了很多内存,导致JVM花 ...
- Unicode转义序列
声明: web前端学习笔记,欢迎大神指点.联系QQ:1522025433. Javascipt 定义了一种特殊序列,使用6位ASCII字符代表任意16Unicode内码.这些Unicode转义序列均以 ...
- review-questions
questions: python字典中items()和iteritems()的区别 items()返回的是列表对象,而iteritems()返回的是迭代器对象 print dic.items() # ...
- 2017-2018-2 20155309 南皓芯 Exp5 MSF基础应用
实践内容 本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路.具体需要完成: 1.1一个主动攻击实践,如ms08_067; 1.2 一个针对浏览器的攻击,如ms11_05 ...
- java基础篇---HTTP协议
java基础篇---HTTP协议 HTTP协议一直是自己的薄弱点,也没抽太多时间去看这方面的内容,今天兴致来了就在网上搜了下关于http协议,发现有园友写了一篇非常好的博文,博文地址:(http: ...
- 《Kafka技术内幕》学习笔记
第一章 Kafka入门 1.1 Kafka流式数据平台 Kafka作为流式数据平台的特点: 消息系统:两种消息模型:队列和发布订阅. 队列模型:将处理工作平均分给消费组中的消费者成员. 发布订阅模型: ...
- Python divmod方法
有95条数据 每十条存一页 all_item = 95 pager = 10 result = all_item.__divmod__(pager) print(result) (9{商},5{余数} ...
- HTML编码规范 - (WEB前端命名规范)
HTML编码规范 (一)命名规则: 头:header 内容:content/container 尾:footer 导航:nav 侧栏:sidebar 栏目:column 页面外围控制整体布局宽度:wr ...
- BZOJ1177 [Apio2009]Oil 二维前缀和 二维前缀最值
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1177 题意概括 在一个n*m的矩阵中,每一个位置一个数字. 现在让你选出3个k*k的矩阵,它们互不 ...
- Python3 - 基础知识、基本了解
一.Python到底是什么? (抄自 金角大王) 1. Python是一门解释型语言? 我初学Python时,听到的关于Python的第一句话就是,Python是一门解释性语言,我就这样一直相信下去, ...