2016-10-13 5 views
0

私はいくつかのパラメータを取る方法があります。そのうちの1つはいくつかのクラスのListであり、nullはこのパラメータの許容値です。Mockitoを使って特定のタイプのヌルリストとマッチさせる

public void doStuff(String string, @Nullable List<SomeClass> list) { 
    ... 
} 

Mockitoを使用してメソッドがnullとしてパラメータとして呼び出されたことを検証するテストを作成したいと思います。

MyClass myClass = ... 
verify(myClass).doStuff(any(String.class), isNull(List.class)); 

が、これは警告生成します:私は isNull(List.class)を使用してみまし必要

未確認の変換
:java.util.Listに< com.package.SomeClass>
が見つかっ:java.util.Listのを

私はリストがnullでない場合には、この警告を修正する方法を見ることができます

// this generates the same warning 
verify(myClass).doStuff(any(String.class), any(List.class)); 

// this does not generate the warning 
verify(myClass).doStuff(any(String.class), Matchers.anyListOf(SomeClass.class))); 

しかし、私はこれらの2つのアプローチを組み合わせる方法を見つけることができないようです。あるいは、私がやろうとしていることを達成する別のアプローチを見つけてください。 (注釈付きの警告を抑制する以外)

+0

なぜ「ヌル」リストが許容可能なパラメータになるのですか?代わりに空のリストを使用しない理由は何ですか? – Spotted

+0

私はそれが理想的なデザインの決定から遠いことに同意します。実際の方法はかなり複雑であり、オプションのパラメータの長いリストを受け入れます。誰かに何十もの空のリストを作成させるのではなく、代わりにnullを渡すことにしました。当然、複数の方法やビルダーや工場を実装する方が理にかなっていましたが、それはAndroidライブラリであり、ユーザビリティの代わりにAPKサイズとデックス数を低く抑えることに重点が置かれていました。私は将来それをきれいにするのが大好きですが、今のところそれは私が仕事をしなければならないことです。 –

+0

しかし、あなたは今問題を解決するのに時間をとっています!なぜこのメソッドをリファクタリングしてモックを動作させようとするのではないのですか?私はそれが完全に時間の価値があると思う。そして、 'null'の代わりに' Collections.emptyList() 'を書くのは大したことではないのですか? – Spotted

答えて

-1

一般的な答えは、明示的なジェネリックメソッド引数を使用することです。

verify(myClass).doStuff(any(String.class), Matchers.<List<SomeClass>>isNull()); 

その他の注意事項:実際には

  • 、警告が何からあなたを保護されていません。 nullnullであり、タイプ消去の場合、これらのフォームはすべて同じバイトコードにコンパイルされます。
  • Java 8はメソッド引数からジェネリック型を推論できるため、isNull()で十分です。
  • Mockito 1.xはクラスorg.mockito.Matchersを呼び出すのに対し、Mockito 2.xはそのクラスをorg.mockito.ArgumentMatchersに敬遠します。どちらの場合でも、マッチャメソッドはorg.mockito.Mockitoから見ることができますが、静的メソッドの継承は意味的に弱いため、これらのメソッドがIDEに表示されないことがあります。
  • Matchersを静的引数として使用しないで<List<SomeClass>>isNull()を指定する方法はありません。何できdon't extract to a field insteadあなたはこの多くを行う必要がある場合の対処は、...

    private static List<SomeClass> nullSomeClassList() { 
        return isNull(); // Return value types can be inferred before Java 8. 
    } 
    
    // elsewhere 
    verify(myClass).doStuff(any(String.class), nullSomeClassList()); 
    

    を地元の静的メソッドを抽出することである...しかし、何をするにしても。副作用はここで重要です。

+0

情報ありがとうございます。私はこれを試しましたが、同様の問題が発生しました。コードがビルドエラーを生成し、メソッドがList を必要とし、代わりにObjectを見つけたという不満がありました。 Matcherの結果をリストにタイプキャストしようとしましたが、ビルドエラーが解決されましたが、未確認の変換警告が生成されるようになりました。今度はObjectをリストに変換することについて不平を言います。 –

関連する問題