【发布时间】: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