在编写代码测试用例时,Mockito是开发人员最常见的选择之一。 然后我们面对的问题是,如何使用Mockito的thenReturn()thenAnswer()方法? 如果您也面临这个问题,请不要担心每个人都面临或已经遇到了这个问题,我们将在这里解决!! 所以,开始吧...

Mockito是最著名的测试模拟框架之一。 让我们假设您已经了解了模仿。 如果没有,您可以在我们继续之前访问官方的Mockito网站 。

在调用真实方法的Mockito方法中,您可以指定调用该方法时要返回的内容或执行的操作。 这称为“模拟”。 有多种方法可以指定模拟行为。 最常见的方法是使用thenReturn()thenAnswer()方法。

大多数时候,使用thenReturn ()(很好),但有时我们需要使用thenAnswer ()。

什么时候应该使用thenReturn,什么时候可以回答?

最简单的答案是–如果在方法调用中需要固定的返回值,则应使用thenReturn(…)。 如果需要执行某些操作或需要在运行时计算值,则应使用thenAnswer(…)

让我们看看例子

假设我们需要在getName()方法调用中返回字符串值“ Mockito”。

 Mockito.when(mock.getName() ).thenReturn(“Mockito”) 

如果在调用getCurrentTime方法时需要返回系统时间,则需要

 Mockito.when (mock.getCurrentTime() ).thenAnswer(I -> new Date() ); 

现在让我们详细介绍

方法thenReturn()需要一个固定的对象,该对象将在我们调用该方法时返回。 我们可以传递任何类型的对象或值,方法调用将返回相同的值。

 Syntax: OngoingStubbing<T> thenReturn(T value); 

thenAnswer方法需要实现接口org.mockito.stubbing.Answer的类的对象。
Answer是具有方法answer(..)的功能接口。 当我们从模拟对象中调用模拟方法时,将调用answer()方法。
我们可以使用Java 8 lambda功能来实现answer方法。

 Syntax: OngoingStubbing<T> thenAnswer(Answer<?> answer); 

两者之间的基本区别是thenRetun()将始终返回同一对象。

每当我们调用模拟方法时,thenAnswer方法都会从对象中调用该方法。

我们还可以将函数传递给thenRetun()来定义返回值。
当我们使用带功能的thenAnswer或thenRetun时,可能有两种情况。

  1. 如果函数具有固定的返回值 ,则结果将没有差异,例如。 thenReturn(getUserName()); 然后Answer(I-> getUserName()); 功能类似
  2. 如果根据某些参数在运行时计算返回值 ,则可能会有不同的结果,例如。 thenReturn(getCurrentTime()); 然后Answer(I-> getCurrentTime());

(I)函数返回固定值时

让我们看下面的示例,我们有一个方法getName()在用户类中进行测试。
我们将创建一个UserTest类进行测试。 然后,我们将模拟getName()方法。

 Public class User { public String getName() { return this .name; }  } // This is the test class which will test the User class  public class UserTest { private String dummyName() { System.out.println( " #dummyName called" ); return "Java" ; }  @Test  public void thenReturnTest() throws Exception { Tester mock = Mockito.mock(User. class );   System.out.println( "------ Using: thenReturn------ " ); Mockito.when(mock.getName()).thenReturn(dummyName());   System.out.println( " -- method calls" ); System.out.println( "Call.1 : " + mock.getName()); System.out.println( "Call.2 : " + mock.getName()); }    @Test  public void thenAnswerTest() throws Exception { Tester mock = Mockito.mock(User. class ); System.out.println( "------ Using: thenAnswer------ " ); Mockito.when(mock.getName()).thenAnswer(i -> dummyName()); System.out.println( " -- method calls" ); System.out.println( "Call.1 : " + mock.getName()); System.out.println( "Call.2 : " + mock.getName()); }  } 

//输出:

—— Using: thenReturn——
— #dummyName called
— method calls
Call.1 : Java
Call.2 : Java
—— Using: thenAnswer——
— method calls
— #dummyName called
Call.1 : Java
— #dummyName called
Call.2 : Java

在上面的示例中,我们可以看到在两种情况下getName()方法都返回相同的值。 但是,打印的消息是不同的。
如果使用thenRetun() ,请在实际调用之前执行 dummyName() 方法

这是因为如上所述,那么thenReturn()需要值,因此在初始化时将执行它并使用返回值。

如果thenAnswer(),则#dummyName调用也会打印两次。 这是因为每次我们调用模拟方法时,都会执行该函数。

(II)在运行时计算返回值

让我们看下面的示例,我们有一个方法getTime()在用户类中进行测试。
我们将创建一个UserTest类进行测试。 然后将模拟getTime()方法。

 Public class User { public String getTime() { return this . time ; }  }  public class UserTest { private String now() { Calendar now = Calendar.getInstance(); return now.get(Calendar.MINUTE) + " : " + now.get(Calendar.SECOND); } private String dummyGetTime() { System.out.println( " #getTime called" ); return now(); }    @Test  public void thenReturnTest() throws Exception { Tester mock = Mockito.mock(User. class );  System.out.println( "------ Using: thenReturn------ " ); Mockito.when(mock.getTime()).thenReturn(dummyGetTime());   System.out.println( " -- method calls" ); System.out.println( "Call.1> " + mock.getTime()+ " called at - " +now); " called at - " +now); TimeUnit.SECONDS.sleep(5); System.out.println( "Call.2> " + mock.getTime()+ " called at - " +now); }    @Test  public void thenAnswerTest() throws Exception { Tester mock = Mockito.mock(User. class ); System.out.println( "------ Using: thenAnswer------ " ); Mockito.when(mock.getTime()).thenAnswer(i -> dummyGetTime());   System.out.println( " -- method calls" ); System.out.println( "Call.1> " + mock.getTime()+ " called at : " +now); TimeUnit.SECONDS.sleep(5); System.out.println( "Call.2> " + mock.getTime()+ " called at : " +now); }  } 

//输出:>

—— Using: thenReturn——
— #getTime called
— method calls
Call.1> 4 : 22 called at- 4 : 22
Call.2> 4 : 22 called at- 4 : 27
—— Using: thenAnswer——
— method calls
— #getTime called
Call.1> 4 : 22 called at- 4 : 22
— #getTime called
Call.2> 4 : 27 called at- 4 : 27

在上面的示例中,我们可以看到,在thenAnswer()情况下,getTime()方法返回不同的值,而在thenRetun()情况下,返回相同的值。
在thenRetun()的情况下,该值是从now()方法(即4:22)计算得出的。 每次调用getTime()函数时,thenReturn()方法中都会使用此值。

在thenAnswer()的情况下,每次我们调用模拟方法getTime()时,也会调用now()方法并返回新值。

绩效影响

如果该方法返回简单的固定值,我们可能看不到任何性能差异。 但是,如果该方法具有数据库或网络调用,则可能会有很大的性能差异。
如果value是固定的,那么我们最好使用thenReturn(),因为它只会执行一次。

结论

我们可以得出结论,thenReturn()始终返回相同的值,而thenAnswer()返回实时计算的值。

快速阅读

  • 如果在方法调用中需要固定的返回值,则应使用thenReturn(...)
  • 如果在运行时计算值,则应使用thenAnswer(...)
  • thenReturn(T value)方法需要固定值,该值将返回
  • thenAnswer(Answer <T> answer)需要Answer接口的实例,该接口的answer()方法每次都被调用
  • 对于固定的返回值,则可以使用Return()

翻译自: https://www.javacodegeeks.com/2020/05/mockito-thenreturn-vs-mockito-thenanswer.html

Mockito“ thenReturn” vs Mockito“ thenAnswer”相关推荐

  1. mockito java_使用Mockito在Java中进行模拟入门

    mockito java 我们都编写了单元测试,但是有时我们面临的挑战是被测单元可能依赖于其他组件. 并且配置其他组件进行单元测试绝对是一个过大的选择. 相反,我们可以使用Mocks代替其他组件,并继 ...

  2. Mockito 简明教程

    原文同步至 http://waylau.com/mockito-quick-start/ Mock 测试是单元测试的重要方法之一.本文介绍了基于 Java 语言的 Mock 测试框架 -- Mocki ...

  3. Mockito的使用(一)——@InjectMocks、@Spy、@Mock

    GItHub上有相应的翻译好的中文文档: https://github.com/hehonghui/mockito-doc-zh/blob/master/README.md#0 搭建Mockito测试 ...

  4. 单元测试源码分析之二Mockito自动装配和插桩

    前面分析过了Mockito是如何通过注解创建对应的mock对象,并对其所有方法设置拦截器.这篇博客再分析下Mockito是如何实现自动装配和插桩的,只有更好的了解其原理,在写复杂单测的时候才能更加得心 ...

  5. mockito_书评:Mockito Essentials

    mockito Sujoy Acharya的Mockito Essentials副标题( Packt出版 ,2014年10月)是:"实用指南,可帮助您使用Mockito进行单元测试并开始运行 ...

  6. 书评:Mockito Essentials

    Sujoy Acharya的Mockito Essentials副标题( Packt Publishing ,2014年10月)是:"实用指南,可帮助您使用Mockito进行单元测试并开始运 ...

  7. Mockito,PowerMock结合Unit 示例

    文章目录 Unit test 示例 1. 工具类测试用例 2. 依赖`spring`容器注入的bean 3. 依赖Spring容器bean同时依赖静态类 4. Mock各种实际情况 1)忽略静态变量初 ...

  8. Mockito使用详解

    Mockito 一张思维导图鸟瞰全文 单元测试 一个单元测试应该有如下特点 应该是自动化的 应该可以快速运行 每个单元测试不应该依赖其它测试的结果和执行顺序,单元测试框架可以按任意的顺序执行每个测试 ...

  9. 单元测试利器——手把手教你使用Mockito

    作者:京东零售 秦浩然 从你成为开发人员的那一天起,写单元测试终究是你逃不开的宿命!那开发人员为什么不喜欢写单元测试呢?究其原因,无外乎是依赖.依赖其他的服务.依赖运行的环境.等等,各种依赖都成为了我 ...

最新文章

  1. freemarker 解析 json
  2. python dataframe 如何去除缺失值
  3. visual studio code安装shadertoy特效环境
  4. 5 Git 分支 - 远程分支
  5. 长春理工计算机学院保研外校,长春理工大学计算机科学技术学院(专业学位)软件工程保研...
  6. jquery.MultiFile 实现自动删掉上传列表
  7. 随机森林做特征重要性排序和特征选择
  8. python拆分合并文件_Python 视频文件的分割和合并
  9. 小米8吃鸡战斗服务器响应超时,小米8使用1天真实体验,看完再决定买不买?
  10. 易语言 — 数据类型
  11. 如何利用百度音乐播放器的API接口来获取高音质歌曲
  12. 贪吃蛇 c语言 不死模式,c语言贪吃蛇游戏完整代码,c语言贪吃蛇教程
  13. 哪个NBA球队会夺冠?用深度学习预测最有潜力的球员!
  14. MP3音频文件转换成caf格式
  15. Android Audio - HAL 层多声卡同时录音框架设计(多语言)
  16. javaweb论文参考文献(2020年精选91个)
  17. Laravel 下使用 FFmpeg 处理多媒体文件
  18. ps显示暂存盘已满如何解决?解决photoshop暂存盘已满的五种方法!
  19. ios 字符加密问题 字符串加密gyb字符返回空
  20. 6种css3鼠标滑过动画效果

热门文章

  1. P5135-painting【组合数学】
  2. jzoj5123-diyiti【统计,容斥】
  3. OJ4007-计算字符串距离【各种dp之2】
  4. 2021牛客暑期多校训练营1 I-Increasing Subsequence(期望dp+优化)
  5. 【图论】Tree之最小方差树(bzoj 3754)
  6. 2017西安交大ACM小学期数据结构 [又是树状数组、异或]
  7. L3-002 堆栈 树状数组+二分答案
  8. Oracle入门(十二J)之同义词
  9. Shell入门(七)之关系运算
  10. java循环结构教程