我正在学习如何使用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秒<<<失败!org.mockito.exceptions.verification.TooManyActualInvocations:客户。setValue> at com.test.app.DataSourceTest.testDataSourceCanFindRecord(DataSourceTest.java:141)而是3倍。不受欢迎的调用:-> at com.test.core.DataSource.cursorToRecord(DataSource.java:210)
我在等记录。setValue(字符串键,字符串值)将被调用一次,因为字符串[]中的"name"字段。Mockito正在登记记录。setValue(字符串键,长值)与记录相同。setValue(字符串键,字符串值),错误。第210行是TIMESTAMP情况下的setValue。我怎样才能纠正这个问题?
如果您查看InvocationMatcher的源代码,看起来检查方法相等性的逻辑比您想象的要慷慨一些,并且在某些情况下可以忽略方法重载。
我不是100%确定,但尝试用isA(String.class)
替换any(String.class)
(接受任何类型的任何对象),这将过滤掉该参数不是字符串的调用。(anyString
仅在Mockito 2.0及以后的版本中检查其类型。)与直觉相反,any(Foo.class)
并不意味着"任何东西,只要它是Foo",它意味着"任何东西"。这是由于Mockito 2.0的变化。
当然,你也可以加强你的验证,以便它检查键或值是否等于一个期望值,但我不确定这在你的情况下有多大可能。