【问题标题】:ArgumentCaptor mockito vararg getAllValuesArgumentCaptor mockito vararg getAllValues
【发布时间】:2016-03-14 16:56:22
【问题描述】:

我想验证辅助类所做的日志记录,该类调用带有一些可变参数的方法。

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

【问题讨论】:

  • 对于可变参数,它存在特殊的匹配器/参数捕获器。 See this thread.
  • 问题不在于匹配或使用参数捕获器:验证器验证该方法是否按预期调用了两次,使用可变参数。但是当 ArgumentCaptor 用于获取捕获的值时,它会返回一个包含两个调用的 3 个参数的列表。

标签: java mockito variadic-functions


【解决方案1】:

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

  • 如果您只有一次调用测试方法,您仍然可以使用捕获器(如使用getAllValues() 提到的操作)进行验证。这是最新 Mockito 3.8.0 文档中为 varargs 推荐的方法
  • 如果您有多个调用,您将能够判断在哪个调用中传递了哪个参数,您只会将它们放在一个列表中。您仍然可以验证调用次数。不过,在这种情况下,您可能会更好地使用 argThat()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-13
    • 2023-02-15
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多