当前位置: 首页 > 知识库问答 >
问题:

我可以混合参数捕捉器和常规匹配器吗?

沃侯林
2023-03-14

我需要在 Mockito 中验证一个具有多个参数的方法,但只需要捕获一个参数,其他参数我只需要一个简单的匹配器。这可能吗?

例如,如果我有:

@Mock
private Map<K,V> mockedMap;
...
ArgumentCaptor<K> argument = ArgumentCaptor.forClass(K.class);
verify(mockedMap).put(argument.capture(), any(V.class));

在这种情况下,我是否需要为每个参数编写一个捕获器,尽管我只需要捕获第一个参数?

共有2个答案

韦知
2023-03-14

当然有用。为什么不会呢?

import java.util.Map;

import org.junit.*;
import org.mockito.*;

import static org.mockito.Mockito.*;
import static org.junit.Assert.*;

public class MockitoTest {
  @Mock
  private Map<Integer, String> mockedMap;

  @Before
  public void setup() {
    MockitoAnnotations.initMocks(this);
  }

  @Test
  public void testCaptor() {
    mockedMap.put(5, "Hello World!");
    ArgumentCaptor<Integer> argument = ArgumentCaptor.forClass(Integer.class);
    verify(mockedMap).put(argument.capture(), any(String.class));

    assertEquals(5L, argument.getValue().longValue());
  }
}

这工作正常并通过。

顺便说一句,您几乎不想模拟数据结构,如<code>List</code>和<code>Map</ccode>,因为正确模拟它们的所有行为是一件非常痛苦的事情,如果您添加了一个元素,然后该元素实际上不存在,那么大多数代码都不会很高兴。在您的情况下,创建部分模拟(使用<code>Mockito.spey</code>)可能比创建实际模拟更好。

司寇研
2023-03-14

在这种情况下,我是否需要为每个参数编写一个捕获器,尽管我只需要捕获第一个参数?

durron597的答案是正确的——如果您想捕获其中一个参数,您不需要捕获所有参数。不过,有一点需要澄清:对< code > argumentcaptor . capture()的调用算作一个Mockito matcher,在Mockito中,如果对任何方法参数使用matcher,就必须对所有参数使用matcher。

对于方法yourMock.your方法(int, int, int)ArgumentCaptor

/*  good: */  verify(yourMock).yourMethod(2, 3, 4);  // eq by default
/*  same: */  verify(yourMock).yourMethod(eq(2), eq(3), eq(4));

/*   BAD: */  verify(yourMock).yourMethod(intCaptor.capture(), 3, 4);
/* fixed: */  verify(yourMock).yourMethod(intCaptor.capture(), eq(3), eq(4));

这些也有效:

verify(yourMock).yourMethod(intCaptor.capture(), eq(5), otherIntCaptor.capture());
verify(yourMock).yourMethod(intCaptor.capture(), anyInt(), gt(9000));

 类似资料:
  • 问题内容: 我需要捕捉一些从PHP本机函数抛出的警告,然后处理它们。 特别: DNS查询失败时,它将引发警告。 / 不起作用,因为警告也不例外。 我现在有2个选择: 似乎有点过分,因为我必须使用它来过滤页面中的每个警告(这是真的吗?); 调整错误报告/显示,以使这些警告不会在屏幕上显示,然后检查返回值;如果为,则找不到主机名的记录。 这里的最佳做法是什么? 问题答案: 设置和还原错误处理程序 一种

  • 问题内容: 我想知道为什么无法进行以下操作: 以我的理解,slice …“爆炸”切​​片,因此可以将其用于多参数函数调用。因此,上述示例实际上应扩展为。 可以正常工作,在这里并不奇怪,但是在上面的示例中,编译器抱怨参数过多。 这是理想的限制吗?我来自一个很好的红宝石背景(至少在我的书中也是一样),这就是为什么这让我感到惊讶。 问题答案: 可变参数的值 可以 通过枚举元素来指定, 也可以 使用现有切

  • 我正在编写一些从第三方库扩展类的JUnit测试。超级类扩展了,所以根据定义,我的子类也扩展了。 在我的子类中,我用前缀编写测试方法,然后执行这些方法。 但是,出于许多原因,我们希望转移到JUnit4(其中一个原因是,我们不希望必须在测试方法前缀) 我尝试过使用JUnit4注释简单地编写新测试,但这些方法没有得到执行。 例如: 不扩展第三方测试类不是一个选项。(值得注意的是,Spring的又扩展了其

  • 如果你的整个网站中有几处小小的样式类似(例如一致的颜色和字体),那么使用变量来统一处理这种情况是非常不错的选择。但是当你的样式变得越来越复杂,你需要大段大段的重用样式的代码,独立的变量就没办法应付这种情况了。你可以通过sass的混合器实现大段样式的重用。 混合器使用@mixin标识符定义。看上去很像其他的CSS @标识符,比如说@media或者@font-face。这个标识符给一大段样式赋予一个名

  • 问题内容: 我需要为某些数据集创建一个匹配查找器系统,如下所示: 有一组对象,每个对象都由一个字符串标识。 每个对象正好具有N个属性P i。每个属性值都是一个字符串。 N = 3的数据库示例(在现实生活中,N = 8)。 系统必须返回s 集,匹配对象属性上的给定查询。在查询中,用户必须指定所有属性值。或者,对于查询中的某些或所有属性,用户可以指定“通配符” ,这意味着任何属性值都将与条件匹配。 查

  • 问题内容: 下面的简单测试案例失败了,但有一个例外。 我不知道怎么了 问题答案: Mockito要求您在存入方法调用时仅使用原始值或仅使用匹配器。完整的例外情况(您未在此处发布)肯定可以解释所有情况。 简单更改行: 至 它应该工作。