1

私はmavenプロジェクトjavaruntimeと、プロジェクトandroidruntimeに依存するmavenプロジェクトを持っていjavaruntimeます。各プロジェクトには、いくつかのクラスをインターフェイスにバインドする Guice-Module があります。

には、コンストラクター注入によって取得javaruntimeするインターフェイスIElementFactoryとクラスがあります。CIElementFactory

public class C {
    @Inject
    public C(IElementFactory factory, ...(other interfaces)...) {...}
    // ...
}

の具体的な実装IElementFactoryandroidruntimeプロジェクト内にあり、 と呼ばれAndroidElementFactoryます。他のインターフェイスのすべての実装は、javaruntime.

には、を知らないため、javaruntimeを使用する必要がある JUnit テストがあります。MockElementFactoryandroidruntime

モジュール内でのみにバインドするIElementFactroryと、モジュール/プロジェクト内のそのインターフェイスに実装がバインドされていないため、テストはもちろん失敗します。AndroidElementFactoryandroidruntimejavaruntime

MockElementFactoryその後、javaruntimeモジュールにバインドすると、テストは問題ありませんandroidruntimeが、IElementFactory が既にバインドされており、バインドMockElementFactoryをオーバーライドすることは不適切であり、Guice では推奨されないため、コンパイルできません。

しかし、モックがテストに使用され、アンドロイドプロジェクトで正しい実装をバインドできるようにするにはどうすればよいですか?

4

1 に答える 1

5

まず第一に、実際にはそれをしたくありません。特にモックを使用してクラスを単体テストする場合は、Guice を使用しないでください。代わりに、クラスを直接インスタンス化して、すべての依存関係をクラスに提供する必要があります。単体テストを書いているので、これは問題にはなりません。テスト内のすべての依存関係は自明であるか、モック化する必要があるためです。

しかし、意図したことを本当に実行したい場合は、プログラムをいくつかのモジュールに分割する必要があります。簡単にするために、それらをMainModuleMockModuleおよび としAndroidModuleます。MainModuleを除くすべてのバインディングを設定しIElementFactoryます。次のようになります。

public class MainModule extends AbstractModule {
    @Override
    protected void configure() {
        // Require presence of IElementFactory
        requireBinding(IElementFactory.class);

        // Bind all other dependencies
        ...
    }
}

そしてあなたMockModuleAndroidModuleあなたはの対応する実装をバインドしますIElementFactory

次に、テストで次のようにインジェクターを作成します。

Injector injector = Guice.createInjector(new MainModule(), new MockModule());

Android プロジェクトでは、次のように作成します。

Injector injector = Guice.createInjector(new MainModule(), new AndroidModule());

インジェクターのインスタンス化がハードコーディングされているためにこれを行うことができない場合は、プログラムのリファクタリングを検討する必要があります。これは、Guice プロジェクトがどのように構造化されているか (特に wrt) ではないためです。単体テスト。プログラムの正確な構造を説明していないため、これ以上は言えません。

于 2013-06-14T05:53:35.640 に答える