Mockito“ thenReturn” vs Mockito“ thenAnswer”

在编写代码测试用例时,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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340232.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python turtle画彩虹的代码_如何用python海龟库画彩虹

python生成的彩虹效果&#xff0c;大家可以参考&#xff1a;使用的python版本&#xff1a;3.7.0 &#xff0c;以下为源代码&#xff1a;# rainbow.py from turtle import * from random import * def HSB2RGB(hues): hues hues * 3.59 #100转成359范围 rgb [0.0,0.0,0.0] i …

vsphere虚拟克隆虚拟服务器,vSphere实战攻略2:虚拟机模板与克隆

【IT168 专稿】 (接上篇)"模板"是VMware为虚拟机提供的一项功能&#xff0c;可以让用户在其中一台虚拟机的基础上&#xff0c;很方便的"派生"或"克隆"出多台虚拟机&#xff0c;这减轻了管理员的负担。1.1 创建模板虚拟机在使用模板之前&#xff…

mysql parameter_C#MySqlParameter问题

(int)faultsGroup是0或1但我总是得到这个错误&#xff1a;列’FaultGroup’不能为null有人告诉我为什么吗&#xff1f;语法看起来不错.MySqlCommand cmdAdd new MySqlCommand("INSERT INTO Faults (" " FaultGroup, Text, Date, IP" ") VALUES (&quo…

python数据写入表格生成图片_python带表格图片生成封装

#!/usr/bin/python3#-*- coding: utf-8 -*-## author:qianqiu from prettytable importPrettyTablefrom PIL importImage, ImageDraw, ImageFontdef create_table_img(data,img_name, **kwargs):img_name 图片名称 D:/project/pythonwork/12306/t.png 或 t.png data 表格内容&a…

java ee maven_针对新手的Java EE7和Maven项目–第6部分

java ee maven从前面的部分恢复 第1 部分 &#xff0c; 第2 部分 &#xff0c; 第3 部分 &#xff0c; 第4 部分 &#xff0c; 第5部分 在上一篇文章&#xff08;第5部分&#xff09;中&#xff0c;我们发现了如何使用Arquillian&#xff08;我们的EJB服务&#xff09;进行单元…

mysql数据库优化教程_mysql数据库索引优化学习教程

MySQL索引的建立对于MySQL的高效运行是很重要的&#xff0c;索引可以大大提高MySQL的检索速度。打个比方&#xff0c;如果合理的设计且使用索引的MySQL是一辆兰博基尼的话&#xff0c;那么没有设计和使用索引的MySQL就是一个人力三轮车。拿汉语字典的目录页(索引)打比方&#x…

windows系统git服务器启动,windowsServer服务器上搭建GIt服务器

十年河东&#xff0c;十年河西&#xff0c;莫欺少年穷学无止境&#xff0c;精益求精摸索了一天&#xff0c;终于把服务器端Git搭建完毕。记录下来&#xff0c;省的以后踩坑。如下&#xff1a;在官网搜索框中输入&#xff1a;download 搜索下载型选择为Java选择开发版然后下载下…

python程序设计题答案_《Python程序设计》习题与答案

第3章 选择结构与循环结构 3.1 分析逻辑运算符“or”的短路求值特性。 答&#xff1a; 假设有表达式“表达式1 or 表达式2”&#xff0c;如果表达式1的值等价于True&#xff0c;那么无论表达式2的值是什么&#xff0c;整个表达式的值总是等价于True。因此&#xff0c;不需要再计…

Linux普通玩家,熟悉这些高频命令就行了

回想当时入门Linux时抱着鸟叔的私房菜啃&#xff0c;看了没几页就放弃了 如果主要从事算法相关工作&#xff0c;其实高频使用的命令就那么些&#xff0c;一起看看吧 用户相关 id – 显示用户的详细信息&#xff08;uid、gid和group&#xff09;last – 列出有关最近登录的信…

如何在黄瓜中进行后端测试

黄瓜是一种规范语言的执行框架。 它并不是要成为测试语言&#xff0c;而是用于创建测试自动化。 黄瓜最适合出现一些现实世界中的参与者互动并取得某种成果的情况。 当可以从用户的角度编写它时&#xff0c;它特别有用。 Given Sarah is a premium club member When Sarah lo…

mysql权限层级体系_MySQL权限体系介绍

官方手册&#xff1a;https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.htmlMySQL是一个多用户的数据库&#xff0c;MySQL的用户可以分为两大类&#xff1a;(1)超级管理员用户(root)&#xff0c;拥有全部权限(2)普通用户&#xff0c;由root创建&#xff0c;普通用…

云服务器 生物信息学,云服务器 生物信息学

云服务器 生物信息学 内容精选换一换挂载有NVMe SSD盘的Linux弹性云服务器(如P1型云服务器)发生故障时&#xff0c;需联系管理员通过异地重建的方式进行恢复&#xff0c;新建故障弹性云服务器。如果故障弹性云服务器在/etc/fstab中设置了NVMe SSD盘的开机自动挂载功能&#xff…

python图像转字符画_python图像处理-字符画风格图片

前言 字符画图片&#xff0c;顾名思义就是由一个个字符组成的图片&#xff0c;下面这张图片很容易帮助你理解&#xff0c;如果我们可以将字符排列好&#xff0c;让他看上去像一个物体的形状&#xff0c;那么最后再将它输出保存为一张图片就可以实现了。下面的这些形状同样可以使…

在mybatis用mysql的代码块_mybatis plus与mysql分库组件mycat的结合

之前的文章简单介绍了一下mybatis plus&#xff1a;《使用Mybatis-plus代替原生Mybatis》。截止目前在项目中使用了一段时间的mybatis plus&#xff0c;再也没有写过sql&#xff0c;都用mp的Wrapper封装查询条件了。这里先简单介绍一下mp的用法(抱歉&#xff0c;上一篇里面讲得…

响应服务器535.5.7.0AUTH,javax.mail.AuthenticationFailedException:535 5.7.3无法发送邮件

我遇到了错误javax.mail.AuthenticationFailedException&#xff1a;535 5.7.3尝试发送电子邮件时的身份验证。我尝试使用两个不同的电子邮件帐户。一个使用Office365服务器详细信息&#xff0c;另一个使用Gmail服务器详细信息。在两种情况下&#xff0c;我都会遇到相同的错误。…

react生命周期函数_如何优雅的消灭掉react生命周期函数

开源不易&#xff0c;感谢你的支持&#xff0c;❤ star concent^_^序言在react应用里&#xff0c;存在一个顶层组件&#xff0c;该组件的生命周期很长&#xff0c;除了人为的调用unmountComponentAtNode接口来卸载掉它和用户关闭掉浏览器tab页窗口&#xff0c;该顶层组件是不会…

jolokia_Hawtio和Jolokia的Hibernate统计

jolokia企业Java的很大一部分处理数据。 在企业设置中使用数据的所有不同方式中&#xff0c;仍然存在使用任何种类的O / R映射的行之有效且广泛教授的方法。 JPA标准使每个人都比较容易使用它&#xff0c;并且它也应该是可移植的。 但是&#xff0c;我们不要谈论迁移细节。 O /…

python主循环方法mainloop_python gobject.mainloop吞噬信号事件

没有人感兴趣,所以让我尝试. 只是在同一页面上&#xff1a; import signal from gi.repository import GObject GObject.threads_init() mainloop GObject.MainLoop() signal.signal(signal.SIGINT, lambda n, f: mainloop.quit()) mainloop.run() 此代码有效&#xff1a; imp…

JVM垃圾收集和优化

总览 在对系统进行性能相关问题的故障排除时&#xff0c;内存优化是一个需要深入分析每个系统在内存中存储的内容&#xff0c;存储时间和访问模式的地方。 这篇文章是要在背景信息上进行注释&#xff0c;并在此工作中要注意一些要点&#xff0c;这些工作要专门针对基于Java的实…

redis desktop manager连不上redis_Redis安装教程

Ⅰ 简介Redis 是一个开源&#xff08;BSD许可&#xff09;的&#xff0c;内存中的数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构&#xff0c;如字符串&#xff08;strings&#xff09;&#xff0c;散列&#xff08;hashes&#…