[英]Mockito verifying method calls
我正在嘗試學習如何使用Mockito,並且掛斷了如何驗證某個對象上的方法被稱為X倍的次數。
我有以下測試代碼
verify(record, times(1)).setValue(Mockito.any(String.class),Mockito.any(String.class));
和以下我要測試的生產代碼
我正在設置string []以遍歷
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:customer.setValue(,); 想要1次:-> com.test.app.DataSourceTest.testDataSourceCanFindRecord(DataSourceTest.java:141),但是是3次。 意外調用:-> com.test.core.DataSource.cursorToRecord(DataSource.java:210)
我期望因為String []中的“名稱”字段而調用一次record.setValue(String key,String value)。 發生的是Mockito正在將record.setValue(String key,Long value)與record.setValue(String key,String value)相同,這是不正確的。 在TIMESTAMP情況下,行210是setValue。 我該如何糾正?
如果查看InvocationMatcher的源代碼,則檢查方法是否相等的邏輯似乎比您想象的要大得多,並且在某些情況下可以忽略方法重載。
我不確定100%,但是請嘗試使用isA(String.class)
替換any(String.class)
(接受任何類型的 對象 isA(String.class)
,這會過濾掉該參數不是String的調用。 ( anyString
僅在Mockito 2.0及更高版本中檢查其類型。)與直覺相反, any(Foo.class)
並不表示“只要它是Foo,就表示任何東西”,而是表示“任何東西”。 這是由於Mockito 2.0中的更改。
當然,您也可以加強驗證,以便它檢查鍵或值是否等於預期值,但是我不確定您的情況如何。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.