0

残念ながら、重要なことをしなければならないコンストラクターがあります。

public MyModule() {
    this.setInjector(Guice.createInjector(new AfterInjectionModule(
            PostConstruct.class, Matchers.any()), new MyGuiceModule()));
}

AfterInjectionModuleここで、パラメータを使用して物事のスキームでが呼び出されたことを確認する必要がありPostConstruct.classます。今のところ、他のパラメータについてはあまり気にすることができませんでした。verify()残念ながら、 Mockitoでこれをどのように行うかは考えられません。私は現在、次のことを試みています。

this.reference = mock(new MyModule());
verify(this.reference).setInjector(Guice.createInjector(
        new AfterInjectionModule(PostConstruct.class, Matchers.any()), 
        new MyGuiceModule()));

私のユニットテストは上記の行で失敗します。このメソッドが最初のパラメーターとしてInjector渡さAfterInjectionModuleれたに設定されていることを確認するにはどうすればよいですか?PostConstruct.class

4

3 に答える 3

1

問題はコンストラクターのモックではなく、Guice.createInjector()への静的な呼び出しだと思います。Mockitoで静的メソッドをモックすることはできないため、動作の結果を検証するか(難しい場合があります)、Powermockなどの別のツールを使用して静的メソッドをオーバーライドすることができます。

于 2013-01-18T20:22:03.447 に答える
0

Mockitoを使用する場合は、とにかく独自のコンストラクターを使用しないため、ここで少し問題が発生します。あなたのコードはコンストラクターに少し重いロジックも入れていることに注意してください。これは良い考えではありません

Mockitoを使い続けたい場合はinit()、テストから呼び出すことができるメソッドにインストラクター設定コードを除外します。本当に必要な場合は、コンストラクターからそのメソッドを呼び出すこともできますが@VisibleForTesting、テストから呼び出すのに十分な表示(おそらく注釈付き)にすることもできます。

その他のオプション:インジェクター設定(またはモジュールの作成)を除外し、静的な方法として個別にテストします。

于 2013-01-18T17:29:11.887 に答える
0

実際の呼び出しをテストするのではなく、呼び出した場合に MyModule が期待どおりに動作するかどうかnew AfterInjectionModule(PostConstruct.class, Matchers.any())、および呼び出さなかった場合のように動作しないかどうかをテストする必要があります。

これは Guice インジェクターに関するものであるため、動作の検証は、インジェクターによって提供されるクラスが実際にAfterInjectionModuleそれらのパラメーターで初期化されたによって提供されるクラスのインスタンスであるかどうかを確認するのと同じくらい簡単です。

于 2013-01-18T10:35:50.983 に答える