我有一个方法被调用两次,我想捕获第二个方法调用的参数。

以下是我的尝试:

ArgumentCaptor firstFooCaptor = ArgumentCaptor.forClass(Foo.class);

ArgumentCaptor secondFooCaptor = ArgumentCaptor.forClass(Foo.class);

verify(mockBar).doSomething(firstFooCaptor.capture());

verify(mockBar).doSomething(secondFooCaptor.capture());

// then do some assertions on secondFooCaptor.getValue()

但我得到了一个TooManyActualInvocations例外,因为mockito认为doSomething只应该调用一次。

如何验证doSomething第二次调用的参数?

我想应该是

verify(mockBar, times(2)).doSomething(...)

Mockito Javadoc的样品:

ArgumentCaptor peopleCaptor = ArgumentCaptor.forClass(Person.class);

verify(mock, times(2)).doSomething(peopleCaptor.capture());

List capturedPeople = peopleCaptor.getAllValues();

assertEquals("John", capturedPeople.get(0).getName());

assertEquals("Jane", capturedPeople.get(1).getName());

你能在每次单独的调用中捕获传递给doSomething()的参数吗?

我喜欢stackoverflow.com/a/14890172

应该注意的是,如果你这样做:Person person = new Person("John"); doSomething(person); person.setName("Jane"); doSomething(person);捕获的论点将是相同的两次(因为实际上它是同一个人的对象),所以capturedPeople.get(0).getName() == capturedPeople.get(1).getName() =="Jane"也可以参见groups.google.com/forum/!msg/mockito/kbrocvedyt0/5htarml9r2‌&8203;wj.

这很好,但是我如何测试两个不同类型的对象调用呢?例如,executorService.submit(new myUnableImpl());然后是executorService.submit(new myAnotherRunableImpl())?

如果有人需要处理@asmaier描述的案例,我在这里发布了一个答案:stackoverflow.com/a/36574817/1466267

嗨@leon,你得到不同类型参数的解决方案了吗?

对于仍然对Leon问题的答案感到疑惑的人,您可以使用公共基类(Runnable),如果需要,可以对捕获的参数进行更具体的类型检查。

由于mockito 2.0,还可以使用静态方法matchers.arghat(argumentmatcher)。在Java 8的帮助下,它现在变得更干净,更易于阅读:

verify(mockBar).doSth(argThat((arg) -> arg.getSurname().equals("OneSurname")));

verify(mockBar).doSth(argThat((arg) -> arg.getSurname().equals("AnotherSurname")));

如果你被绑定到较低的Java版本,也没有那么糟糕:

verify(mockBar).doSth(argThat(new ArgumentMatcher() {

@Override

public boolean matches(Object emp) {

return ((Employee) emp).getSurname().equals("SomeSurname");

}

}));

当然,这些都不能验证通话顺序—您应该使用inorder:

InOrder inOrder = inOrder(mockBar);

inOrder.verify(mockBar).doSth(argThat((arg) -> arg.getSurname().equals("FirstSurname")));

inOrder.verify(mockBar).doSth(argThat((arg) -> arg.getSurname().equals("SecondSurname")));

请看一下mockito-java8项目,它可以进行如下调用:

verify(mockBar).doSth(assertArg(arg -> assertThat(arg.getSurname()).isEqualTo("Surname")));

这是一个很好的技巧。不过,我现在得到了一些相当神秘的输出:"想要但没有调用:/n mockappender.append();"—arg有一个CharSequence。你知道如何让报告正确打印出"通缉犯"参数吗?

如果您不想验证所有对doSomething()的调用,只验证最后一个调用,则可以使用ArgumentCaptor.getValue()。根据Mockito Javadoc:

如果多次调用该方法,则返回最新捕获的值

所以这是可行的(假设Foo有一个方法getName()):

ArgumentCaptor fooCaptor = ArgumentCaptor.forClass(Foo.class);

verify(mockBar, times(2)).doSomething(fooCaptor.capture());

//getValue() contains value set in second call to doSomething()

assertEquals("2nd one", fooCaptor.getValue().getName());

是否有任何方法可以捕获这两个值?

@哈什用了Listfoos = fooCaptor.getValues();。

也可以使用@captor注释的argumentcaptor。例如:

@Mock

List mockedList;

@Captor

ArgumentCaptor argCaptor;

@BeforeTest

public void init() {

//Initialize objects annotated with @Mock, @Captor and @Spy.

MockitoAnnotations.initMocks(this);

}

@Test

public void shouldCallAddMethodTwice() {

mockedList.add("one");

mockedList.add("two");

Mockito.verify(mockedList, times(2)).add(argCaptor.capture());

assertEquals("one", argCaptor.getAllValues().get(0));

assertEquals("two", argCaptor.getAllValues().get(1));

}

用Java 8的lambdas,一个方便的方法就是使用

org.mockito.invocation.InvocationOnMock

when(client.deleteByQuery(anyString(), anyString())).then(invocationOnMock -> {

assertEquals("myCollection", invocationOnMock.getArgument(0));

assertThat(invocationOnMock.getArgument(1), Matchers.startsWith("id:"));

}

我看不出这比旧方法更方便。我喜欢使用羊羔肉,但我不确定这是不是。

java 调用多次_关于java:Mockito可以捕获多次调用方法的参数吗?相关推荐

  1. java项目----教务管理系统_基于Java的教务管理系统

    java项目----教务管理系统_基于Java的教务管理系统 2022-04-22 18:18·java基础 最近为客户开发了一套学校用教务管理系统,主要实现学生.课程.老师.选课等相关的信息化管理功 ...

  2. java反射的优化_请问Java反射的性能为什么比直接调用慢一个数量级左右?

    Method.invoke()本身要用数组包装参数:而且每次调用都必须检查方法的可见性(在Method.invoke()里),也必须检查每个实际参数与形式参数的类型匹配性(在NativeMethodA ...

  3. java如何添加进程_如何创建一个进程,如何进程调用进程

    java一般用线程就够了,多进程优势在于每个进程互不干扰,劣势在于太耗费内存,任何事情都不是绝对的,在编写Java程序时,有时候需要在Java程序中执行另外一个程序. 1.启动程序 Java提供了两种 ...

  4. JAVA 油站管理系统_基于JAVA的全国加油站[实时油价]接口调用代码实例

    代码描述:基于JAVA的全国加油站[实时油价]接口调用代码实例 接口地址:https://www.juhe.cn/docs/api/id/7 1.[代码][Java]代码 import java.io ...

  5. java执行python脚本_通过Java调用Python脚本

    在进行开发的过程中,偶尔会遇到需要使用Java调用Python脚本的时候,毕竟Python在诸如爬虫,以及科学计算等方面具有天然的优势.最近在工作中遇到需要在Java程序中调用已经写好的Python程 ...

  6. bat 调用class文件_【Java视频教程】day42-??什么是Class???

    使用反射破坏单例 预防措施: 使用反射破坏单例https://www.zhihu.com/video/1087688627387117568 获取和修改成员变量(Field) 获取成员变量的方法: 获 ...

  7. java对外接口安全问题_怎么保证对外暴露接口的安全性(调用频率限制)

    如何限制接口调用者对接口的调用频率? 问题:对某个对外暴露的接口加一个限制:调用者一分钟之内调用次数不能超过100次,如果超过100次就直接返回给调用者失败的信息. 给调用者一个SECRET,每次调用 ...

  8. java pdf插件下载_免费java pdf控件

    云原生的概念和理论体系非常的完备,but talk is cheap , show me the code ! 但是作为一名程序员,能动手的咱绝对不多BB,虽然talk并不cheap , 能跟不同层次 ...

  9. java程序无法启动_由于Java程序,Tomcat无法启动

    我有一个调用MMQ侦听器的Java Servlet . 我正在Tomcat服务器中部署应用程序 AppServlet.java package com.cisco.cstg.platform; imp ...

最新文章

  1. 英特尔 i5-9400F,或将成为本年最高性价比的游戏处理器
  2. 红帽收购混合云管理提供商NooBaa,混合云爆发节点临近!
  3. vs2015 C#打包程序为exe
  4. Python实例--文本词频统计
  5. mybatis-嵌套(关联)查询/ N+1 / 延迟加载
  6. 在Docker容器中的Tomcat上运行ADF Essentials
  7. libsvm java下载_一个基于LIBSVM(JAVA)的股票预测demo
  8. sql server 以10分钟分组 统计人数
  9. java发送http get请求的两种方式
  10. 3个月亏17亿,贝壳释放了什么信号?
  11. 不用wp-pagenav,wordpress自带分页代码调用
  12. no such file or directory : 'users/shikx/xxx/xxx/Appirater.m'
  13. 【转】UCenter的MVC架构
  14. oracle库客户端完整卸载,卸载Oracle数据库或客户端​
  15. Mac环境配置MySQL(详细)
  16. 计算机撤销英语,正在撤销对计算机所做的更改要等多久
  17. [读书笔记]《一本书读懂财报》
  18. C#语言实例源码系列-扫描局域网内的所有IP和端口
  19. Visual Question Answering: Datasets, Algorithms, and Future Challenges文章翻译
  20. vs code 语法_VS Code上的Java现在具有语法模式和SonarLint支持

热门文章

  1. 数据仓库和商业智能演进五个阶段
  2. html5 小太阳系模型,初学html5太阳系
  3. 如何绘制炫酷的韦恩图(薇恩图)Venn diagram
  4. 织梦DedeCMS简略标题
  5. 生活中我们如何避免忘事?
  6. 微信小程序单元测试攻略
  7. Word文档表格中插入图片无法完整显示解决办法
  8. Openlab实验平台实验--Mininet Mac地址学习实验
  9. python实验报告范文及模板_太阳能电池实验报告模板
  10. 牛津大学和剑桥大学计算机科学博士专业申请要求PK