2013-05-14 141 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.

當然,你也可以加強你的驗證,因此它檢查的關鍵或價值等於預期值,但我不知道你的情況有多可能。