Mockito验证方法调用

时间:2013-05-14 04:10:07

标签: 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"};
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。我怎么能纠正这个?

1 个答案:

答案 0 :(得分:0)

如果查看InvocationMatcher的源代码,看起来检查方法相等性的逻辑比你想象的要大一些,并且在某些情况下可能会忽略方法重载。

我不是百分百肯定,但尝试用any(String.class)替换isA(String.class)(接受any objectany type),这会过滤出该参数所在的调用不是字符串。 (anyString仅在Mockito 2.0及更高版本中检查其类型。)违反直觉,any(Foo.class)并不意味着“任何东西,只要它是一个Foo”,它意味着“任何东西”。 This is due to change in Mockito 2.0.

当然,您还可以收紧验证,以便检查密钥或值是否等于预期值,但我不确定您的情况有多可能。