1

私は 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[] の「name」フィールドのために、record.setValue(String key, String value) が 1 回呼び出されることを期待しています。何が起こっているのかというと、Mockito は record.setValue(String key, Long value) を record.setValue(String key, String value) と同じものとして登録していますが、これは正しくありません。行 210 は、TIMESTAMP の場合の setValue です。どうすればこれを修正できますか?

4

1 に答える 1

0

InvocationMatcherのソース コードを見ると、メソッドの等価性をチェックするロジックが思ったよりも少し寛大で、場合によってはメソッドのオーバーロードを無視できるようです。

100% 確信があるわけではありませんが、 (任意のタイプ任意のオブジェクトany(String.class)を受け入れる) をに置き換えてみてください。これにより、そのパラメーターが文字列ではない呼び出しが除外されます。( Mockito 2.0 以降でのみ型をチェックします。) 直観に反して、「Foo である限り何でも」という意味ではなく、「何でも」を意味します。これは、Mockito 2.0 での変更によるものです。isA(String.class)anyStringany(Foo.class)

もちろん、検証を強化して、キーまたは値が期待値と等しいことを確認することもできますが、あなたのケースでそれがどのように可能かはわかりません.

于 2013-05-15T23:27:28.627 に答える