2013-05-14 180 views
1

我想学习如何使用Mockito,我挂断了如何去验证某个对象上的方法被称为X次的次数。Mockito验证方法调用

我有下面的测试代码

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}; 

和生产代码这是在一个循环中,通过串[]

迭代

这是错误我得到

testDataSourceCanFindRecord(com.test.app.DataSourceTest)时间 经过:0.081秒< < <失败! org.mockito.exceptions.verification.TooManyActualInvocations: customer.setValue(,);通缉1次: - > at com.test.app.DataSourceTest.testDataSourceCanFindRecord(DataSourceTest.java:141) 但是3次。不希望调用: - >在com.test.core.DataSource.cursorToRecord(DataSource.java:210)

我期待record.setValue(String键,字符串值)被称为由于一次String []中的“name”字段。发生什么事是Mockito注册record.setValue(字符串键,长值)作为record.setValue(字符串键,字符串值),这是不正确的。第210行是TIMESTAMP情况下的setValue。我怎样才能纠正这一点?

+0

你如何创建'cursor'?我认为使用真实的“记录”对象而不模仿并在从光标设置它们后验证这些值是否正确会容易得多。 – 2013-05-14 04:20:19

+0

我在嘲笑光标。我嘲笑除了正在测试的DataSource类以外的所有东西。我仍然试图弄清楚什么是模拟,什么不该 – David 2013-05-14 04:26:15

回答

0

如果你看看InvocationMatcher的源代码,它看起来像检查方法相等的逻辑比你想象的更慷慨一些,并且在某些情况下可以忽略方法重载。

我不是100%肯定,但尝试更换any(String.class)(它接受的any typeany object)与isA(String.class),这将筛选出的调用,其中该参数是不是字符串。 (anyString只会在Mockito 2.0及更高版本中检查它的类型)。直觉上,any(Foo.class)并不意味着“只要它是Foo”,它就意味着“任何东西”。 This is due to change in Mockito 2.0.

当然,你也可以加强你的验证,因此它检查的关键或价值等于预期值,但我不知道你的情况有多可能。

相关问题