ArgumentCaptor mockito vararg getAllValues



我想验证一个帮助程序类所做的日志记录,该类调用带有一些变量的方法。

我正在使用 Mockito (1.10.19) 来模拟实际的记录器,并验证是否按预期调用了模拟方法。

我使用ArgumentCaptor来验证参数。

Mockito.verify 验证模拟方法被调用的次数,但是,ArgumentCaptor.getAllValues 返回一个数组,其中包含所有方法调用的所有参数。

下面是一个示例代码:

interface Logger
{
    void info(Object... params);
}
@Mock
Logger logger;
public void logMatrix(String[][] matrix)
{
    for (int column = 0; column < matrix.length; column++)
    {
        logger.info(column, " : ", matrix[column]);
    }
}
@Test
public void givenMatrix_whenLogMatrix_thenLogsEachRow() throws Exception
{
    String[][] matrix = {
        {"a", "b"},
        {"c", "d"}
    };
    ArgumentCaptor<Object[]> captor = ArgumentCaptor.forClass(Object[].class);
    logMatrix(matrix);
    // verify the mocked method is called twice
    Mockito.verify(logger, times(2)).info(captor.capture());
    // verify the contents of the calls: expecting two arrays, one for each call 
    assertThat(captor.getAllValues()).hasSize(2);
    // fails !
}

失败是:

java.lang.AssertionError: 
   Expected size:<2> but was:<6> in:
      <[0, " : ", ["a", "b"], 1, " : ", ["c", "d"]]>
   at TestLogHelper.givenMatrix_whenLogMatrix_thenLogsEachRow(TestLogHelper.java:72)
...

是误用吗? 还是 mockito 中的错误?

因此,

5 年后,ops 问题仍未得到解答,因为只有解决方法。这些是:

  • 如果您只有一次测试方法的调用,您仍然可以使用捕获器,例如使用 getAllValues() 进行验证的 op。这是最新 Mockito 3.8.0 文档中推荐用于 varargs 的方法
  • 如果您有多个调用,您将无法分辨哪个参数在哪个调用中传递,您将只将它们放在一个列表中。您仍然可以验证调用次数。但是,在这种情况下,使用argThat()可能会更好

我认为这曾经是一个错误或其他一些行为是getAllValues() .

这里有一个关于这个问题或类似问题的讨论:https://github.com/mockito/mockito/issues/584

您的代码今天可以工作,或者至少getAllValues()确实会像预期的那样返回大小为 2 的列表。

相关内容

  • 没有找到相关文章

最新更新