Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ArgumentCaptor mockito vararg getAllValues_Java_Mockito_Variadic Functions - Fatal编程技术网

Java ArgumentCaptor mockito vararg getAllValues

Java ArgumentCaptor mockito vararg getAllValues,java,mockito,variadic-functions,Java,Mockito,Variadic Functions,我想验证helper类所做的日志记录,它使用一些vararg调用一个方法 我使用Mockito(1.10.19)模拟实际的记录器,并验证模拟的方法是否按预期调用 我使用ArgumentCaptor来验证参数 Mockito.verify验证调用模拟方法的次数, 但是,ArgumentCaptor.getAllValues返回一个数组,其中包含所有方法调用的所有参数 下面是一个示例代码: interface Logger { void info(Object... params); }

我想验证helper类所做的日志记录,它使用一些vararg调用一个方法

我使用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 !
}
接口记录器
{
无效信息(对象…参数);
}
@嘲弄
记录器;
公共void日志矩阵(字符串[][]矩阵)
{
for(int column=0;column
失败是:

java.lang.AssertionError: 
   Expected size:<2> but was:<6> in:
      <[0, " : ", ["a", "b"], 1, " : ", ["c", "d"]]>
   at TestLogHelper.givenMatrix_whenLogMatrix_thenLogsEachRow(TestLogHelper.java:72)
...
java.lang.AssertionError:
预期大小:但为:英寸:
在TestLogHelper.givenMatrix_whenLogMatrix_thenLogsEachRow(TestLogHelper.java:72)
...

这是误用吗?还是mockito中的一个bug?

所以5年后,ops问题仍然没有答案,因为目前只有解决办法。这些是:

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

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