模拟验证方法调用



我正在学习如何使用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的变化。

当然,你也可以加强你的验证,以便它检查键或值是否等于一个期望值,但我不确定这在你的情况下有多大可能。

相关内容

  • 没有找到相关文章

最新更新