【发布时间】:2013-05-14 04:10:06
【问题描述】:
我正在尝试学习如何使用 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 秒 在 com.test.app.DataSourceTest.testDataSourceCanFindRecord(DataSourceTest.java:141) 但是是3次。不受欢迎的调用: -> 在 com.test.core.DataSource.cursorToRecord(DataSource.java:210)
我希望 record.setValue(String key, String value) 被调用一次,因为 String[] 中的“name”字段。发生的事情是 Mockito 将 record.setValue(String key, Long value) 注册为与 record.setValue(String key, String value) 相同的东西,这是不正确的。第 210 行是 TIMESTAMP 情况下的 setValue。我该如何纠正这个问题?
【问题讨论】:
-
如何创建
cursor?我认为使用真正的record对象而不进行模拟会容易得多,并在从光标设置它们后验证值是否正确。 -
我在嘲笑光标。我正在嘲笑除正在测试的 DataSource 类之外的所有内容。我仍在试图弄清楚什么可以模拟,什么不可以
标签: android mockito robolectric roboguice