/*
  * 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获取入参数并动态设置返回值的更多相关文章

  1. 常量函数、常量引用参数、常量引用返回值[C++]

    1. 关于常量引用正像在C语言中使用指针一样,C++中通常使用引用 有一个函数... foo()并且这个函数返回一个引用...... & foo()...., 一个指向位图(Bitmap)的引 ...

  2. 使用 ResponseBodyAdvice 拦截Controller方法默认返回参数,统一处理返回值/响应体

    使用 @ControllerAdvice & ResponseBodyAdvice 拦截Controller方法默认返回参数,统一处理返回值/响应体 1.Controller代码 以下是Con ...

  3. day03 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数

    本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 温故知新 1. 集合 主要作用: 去重 关系测 ...

  4. Java程序调用带参数的shell脚本返回值

    Java程序调用带参数的shell脚本返回值 首先来看看linux中shell变量(\(#,\)@,$0,$1,\(2)的含义解释 变量说明: -  \)$  Shell本身的PID(ProcessI ...

  5. JQuery/JS select标签动态设置选中值、设置禁止选择 button按钮禁止点击 select获取选中值

    //**1.设置选中值:(根据索引确定选中值)**// var osel=document.getElementById("selID"); //得到select的ID var o ...

  6. c++11之获取模板函数的参数个数和函数返回值类型

    本文演示c++需要支持c++11及以上标准 获取参数个数 1.模板函数声明 template <class R, class... Args> R getRetValue(R(*)(Arg ...

  7. c语言main函数返回值、参数详解(返回值是必须的,0表示正常退出)

    C语言Main函数返回值 main函数的返回值,用于说明程序的退出状态.如果返回0,则代表程序正常退出:返回其它数字的含义则由系统决定.通常,返回非零代表程序异常退出. 很多人甚至市面上的一些书籍,都 ...

  8. c++特性:指向类成员的指针和非类型类模板参数和函数指针返回值 参数推导机制和关联型别

    一.c++允许定义指向类成员的指针,包括类函数成员指针和类数据成员指针 格式如下: class A { public: void func(){printf("This is a funct ...

  9. [android] setOnTouchEvent 设置返回值为true 和 false的区别

    今天在做自定义的可选文本的 TextView 类时,用到了 View 类的 setOnTouchListener(OnTouchListener l)事件监听,在构造 OnTouchListener ...

随机推荐

  1. Python 检测系统时间,k8s版本,redis集群,etcd,mysql,ceph,kafka

    一.概述 线上有一套k8s集群,部署了很多应用.现在需要对一些基础服务做一些常规检测,比如: 系统时间,要求:k8s的每一个节点的时间,差值上下不超过2秒 k8s版本,要求:k8s的每一个节点的版本必 ...

  2. 字符串反转,例如"abc"反转"cba"

    package stringyiwen; /* * 字符串反转,例如"abc"反转"cba" */public class StringTestChar { p ...

  3. ruby学习-字符串

    字符串 1.创建字符1:new用来创建新字符,empty?检验字符是否为空 title = String.new #=> "" title.empty? #=>true ...

  4. DDD领域模型数据访问权限之权限(十二)

    实现权限的领域对象:BAS_Permission public partial class BAS_Permission:AggreateRoot { private IRepository<B ...

  5. 【C++ Primer 第15章】定义派生类析构函数

    学习资料 • 基类和派生类析构函数执行顺序 定义派生类析构函数 [注意]定义一个对象时先调用基类的构造函数.然后调用派生类的构造函数:析构的时候恰好相反:先调用派生类的析构函数.然后调用基类的析构函数 ...

  6. WebApi表头设置跨域

    public static class WebApiConfig { public static void Register(HttpConfiguration config) { var setti ...

  7. 003 关于shell基础,大数据的前期准备

    一:正则表达式 1.通配符与正则表达式的区别 通配符有 *,?,[]. 区别: 通配符用来匹配文件名 正则表达式是为了匹配字符串 2.“.*”的意思 .:任意字符 *:匹配前一个字符任意次 3.过滤出 ...

  8. 《Gradle权威指南》--Gradle构建脚本基础

    No1: 设置文件默认名是setting.gradle,放在根目录下,大多数作用都是为了配置子工程 No2: 一个Project包含很多个Task.Task就是一个操作,一个原子性的操作.其实它是Pr ...

  9. Digital biquad filter

    Direct Form 1 The most straightforward implementation is the Direct Form 1, which has the following ...

  10. 【猿分享第10期】微信小程序Meetup扫盲专场回顾(转载)

    首先感谢答疑师:子慕 前端工程师,目前就职于医联,偶尔写点博客,吐槽总结,偶尔吟“湿”作对,润滑万物,江湖人称子慕大诗人. 直播间语音回放收听,请微信扫描下图二维码授权进入即可. 以下为本次直播的全部 ...