簡體   English   中英

Mockito驗證方法調用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM