ArgumentCaptor mockito vararg getAllValues

时间:2016-03-14 16:56:22

标签: java mockito variadic-functions

我想验证辅助类所做的日志记录,它使用一些varargs调用方法。

我正在使用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中的错误?

1 个答案:

答案 0 :(得分:1)

所以在 5 年后操作问题仍然没有答案,因为只有解决方法。它们是:

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