Android Mockito验证方法调用

Android Mockito验证方法调用,android,mockito,robolectric,roboguice,Android,Mockito,Robolectric,Roboguice,我正在尝试学习如何使用Mockito,我被如何验证某个对象上的方法被调用了X次的问题所困扰 我有以下测试代码 verify(record, times(1)).setValue(Mockito.any(String.class),Mockito.any(String.class)); 下面是我要测试的一段生产代码 我正在设置要迭代的字符串[] protected String[] columnNames = {"_id", "created_at", "updated_at", "name"}

我正在尝试学习如何使用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};
以及循环中的生产代码,循环遍历字符串[]

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;
                }
            }
        }
这就是我得到的错误

testDataSourceCanFindRecordcom.test.app.DataSourceTest时间 在com.test.core.DataSource.cursorToRecordDataSource.java:210处运行时间:0.081秒


我希望record.setValueString键、String值调用一次,因为字符串[]中的name字段。发生的情况是Mockito正在注册record.setValueString键,Long值与record.setValueString键,String值相同,这是不正确的。第210行是时间戳情况下的设置值。如何更正此问题?

如果您查看源代码,检查方法相等性的逻辑似乎比您想象的要宽松一些,并且在某些情况下可以忽略方法重载

我不是100%确定,但是尝试用isAString.class替换接受of的anyString.class,这将过滤掉该参数不是字符串的调用。anyString仅在Mockito 2.0及更高版本中检查其类型。与直觉相反,anyFoo.class并不意味着什么,只要它是一个Foo,它就意味着什么


当然,您也可以加强验证,以便它检查键或值是否等于预期值,但我不确定在您的情况下这是否可能。

如何创建光标?我认为在不模拟的情况下使用real record对象会容易得多,并在从游标设置值后验证值是否正确。我正在模拟游标。除了正在测试的DataSource类之外,我正在模拟所有的东西。我仍在试图弄清楚该嘲笑什么,不该嘲笑什么