gpt4 book ai didi

java - ArgumentCaptor mockito vararg getAllValues

转载 作者:行者123 更新时间:2023-12-03 20:19:45 25 4
gpt4 key购买 nike

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

我正在使用 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 年后操作问题仍然没有答案,因为只有解决方法。这些是:

  • 如果您只有一次调用测试方法,您仍然可以使用像 op 提到的捕获器,使用 getAllValues()用于验证。这是最新 Mockito 3.8.0
  • 文档中推荐用于可变参数的方法
  • 如果您有多个调用,您将 不是 能够分辨哪个参数是在哪个调用中传递的,您只会将它们放在一个列表中。您仍然可以验证调用次数。但是,您可能会更好地使用 argThat()在这种情况下
  • 关于java - ArgumentCaptor mockito vararg getAllValues,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35993559/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com