我正在努力学习如何使用Mockito,而且我已经挂断了如何验证某个对象的方法被称为X次。
我有以下测试代码
verify(record, times(1)).setValue(Mockito.any(String.class),Mockito.any(String.class));
以及我正在尝试测试的以下产品代码
字符串[]我正在设置迭代
protected String[] columnNames = {"_id", "created_at", "updated_at", "name"};
protected ColumnType[] columnTypes = {ColumnType.INTEGER, ColumnType.TIMESTAMP, ColumnType.TIMESTAMP, ColumnType.TEXT};
和循环中的生产代码,遍历String []
for (int i = 0; i < columnCount; i++) {
if (columnNames[i].equals("_id")) {
record.setId(cursor.getInt(0));
} else {
switch (columnTypes[i]) {
case BOOL:
record.setValue(columnNames[i], cursor.getInt(i));
break;
case TEXT:
record.setValue(columnNames[i], cursor.getString(i));
break;
case INTEGER:
record.setValue(columnNames[i], cursor.getInt(i));
break;
case TIMESTAMP:
record.setValue(columnNames[i], cursor.getLong(i));
break;
case LONG:
record.setValue(columnNames[i], cursor.getLong(i));
break;
case DOUBLE:
record.setValue(columnNames[i], cursor.getDouble(i));
break;
default:
record.setValue(columnNames[i], "");
break;
}
}
}
这就是我得到的错误
testDataSourceCanFindRecord(com.test.app.DataSourceTest)时间 经过时间:0.081秒&lt;&lt;&lt;失败! org.mockito.exceptions.verification.TooManyActualInvocations: customer.setValue(,);通缉1次: - &GT; at com.test.app.DataSourceTest.testDataSourceCanFindRecord(DataSourceTest.java:141) 但是是3次。不受欢迎的调用: - &GT;在com.test.core.DataSource.cursorToRecord(DataSource.java:210)
由于String []中的“name”字段,我期待一次调用record.setValue(String key,String value)。发生的事情是Mockito将record.setValue(String key,Long值)注册为与record.setValue(String key,String value)相同的东西,这是不正确的。第210行是TIMESTAMP案例中的setValue。我怎么能纠正这个?
答案 0 :(得分:0)
如果查看InvocationMatcher的源代码,看起来检查方法相等性的逻辑比你想象的要大一些,并且在某些情况下可能会忽略方法重载。
我不是百分百肯定,但尝试用any(String.class)
替换isA(String.class)
(接受any object的any type),这会过滤出该参数所在的调用不是字符串。 (anyString
仅在Mockito 2.0及更高版本中检查其类型。)违反直觉,any(Foo.class)
并不意味着“任何东西,只要它是一个Foo”,它意味着“任何东西”。 This is due to change in Mockito 2.0.
当然,您还可以收紧验证,以便检查密钥或值是否等于预期值,但我不确定您的情况有多可能。