为了账号安全,请及时绑定邮箱和手机立即绑定

仅验证方法池中的特定交互

仅验证方法池中的特定交互

人到中年有点甜 2023-06-04 15:42:46
我目前正在编写黑盒测试,我必须使用 Mockito 验证是否使用特定参数调用了方法池中的一个方法。是否调用特定方法并不重要,但必须调用其中一个方法。此外,如果方法被调用,我想验证它们是否仅使用特定参数调用。在具体层面上:我有这个类被模拟并注入我的黑匣子:class Mock {    void option1(String arg1)    void option2(String arg1, int arg2)    void option3(String arg1, int arg2, int arg3)    void otherMethod()}在黑盒内,一个或多个“optionX”方法被调用一次或多次。现在我想验证至少有一个“optionX”方法在黑盒子中被调用,并且如果任何“optionX”方法被调用,它只会用特定的参数调用。目前的测试代码是这样的Mock mock = spy(realObject);blackbox.doBlackboxStuff(mock);verify(mock, atLeast(1)).option1("Test");verify(mock, atLeast(1)).option2("Test", 1);verify(mock, atLeast(1)).option3("Test", 1, 2);verifyNoMoreInteractions(mock);像上面这样单独的“atLeast(1) 验证”是行不通的,因为这样每个方法都必须被调用。此外,我不能保证黑盒不会调用 otherMethod(),因此 verifyNoMoreInteractions 将失败,即使我不关心 otherMethod() 调用。有没有一种优雅的方法来解决这个问题(或者至少是一种方法)?
查看完整描述

2 回答

?
饮歌长啸

TA贡献1951条经验 获得超3个赞

有一种方法有点老套但应该有效:


MockingDetails details = Mockito.mockingDetails(mock);

Collection<Invocation> invocations = details.getInvocations();


for(Invocation invocation: invocations){

   if(CollectionUtils.isNotEmpty(invocation.getRawArguments()){

      return;

   }

}


fail();

所以基本上,如果至少有一个调用包含您的测试通过的任何参数。假设otherMethod没有示例中的参数。


查看完整回答
反对 回复 2023-06-04
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

可能是你所有的方法option1......option3调用一些常见的辅助方法。至少它们名称的相似性表明在功能上也可能存在一些相似性。现在,让我们假设他们都打电话给helperoptionx然后,您可以检查是否调用了任何方法,而不是检查是否helper调用了任何方法。



查看完整回答
反对 回复 2023-06-04
  • 2 回答
  • 0 关注
  • 100 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信