2016-06-14 16 views
3

は広く、私の現在のプロジェクトで使用されているパターンがあります:ユニットテストでパラメータを注入するメソッドを呼び出す方法は?

private Collection<Converter<T>> converters = new HashSet<>(); 

@Inject 
private void init(@Any Instance<Converter<T>> converters) { 
    for (Converter<T> converter : converters) { 
     this.converters.add(converter); 
    } 
} 

私が欲しいと彼らは自動的に私のBeanに注入されて、私はできるだけ多くのコンバータを作成することができますこの方法です。

私の問題は今テスト中です:コンバーターのコレクションは自分のコードで使われていますが、Junitはinit(..)メソッドを呼び出さないので、それを呼んでモックされたコンバータを設定する必要があります。

私はメソッドを保護することができましたが、私はメソッドの可視性の範囲を変更しているので、それでOKだと感じません。

また、リフレクションを使用してメソッドを呼び出すこともできますが、これも正しいとは限りません。

このコードは、このコードをよりテスト可能に改善できるという結論に至りました。

私はこのコードを変更して、テスト容易性は向上しますが、参照は自動的に注入されますか?

+0

どうしてこのように進む必要がありますか?フィールドコンバーターのタイプとしてインスタンスを保持してフィールドに直接注入するのはなぜですか? –

+0

@ NicolasFilottoを実行すると、コレクションの各イテレータでmy Converterの新しいインスタンスが作成されます – JSBach

答えて

1

「public」または「protected」にしてください。

このようにしてコレクションのポストインスタンシエーションを変更した人から実際に保護されているわけではないので、その方法を公開することで何も失うことはありません(実際には、あなたのクラスを少しだけ良くすることを主張するのは、注入/反射の使用を強制するのではなく、構築方法を選ぶようにするからです。

ポストインスタンス化の変更を完全に防止したい場合は、とにかく変更可能なコレクション型を使用してコンストラクタインジェクションに変更する必要がありますが、これがあなたがしたいことであるという印象。

1

「パッケージ」内にコードを書くことができる人を「信頼する」ことができない場合...私は、メソッドの「プライベート」を持っていれば、本当に助けにならないと思います。人々が混乱して、あなたのパッケージにコードを書くことができれば、とにかく混乱する方法が見つかるからです。

意味:メソッドに「プライベート」をドロップすると、はい、パッケージに表示されます。しかし、あなたはそれにjavadocを置くことができます: "直接呼び出してはいけません;単体テスト/自動配線のみに使用する"かそのようなものです。

関連する問題