2016-08-19 7 views
8

私はMVPで働いていましたが、プレゼンターはビジネスロジックを持ち、Androidの内部構造はまったく参照されていないため、普通はJunit(Instrumentationではなく)を使ってプレゼンターをテストします。AndroidプレーンDagger 2とJunit 2

Dagger 2に切り替えると、自分のアプリケーションコンポーネントの「TestModule」を設定する際に問題があることがわかりました。テストクラス内から動作しませんコンポーネントの作成

  1. は、標準のJUnitテストでダガーを使用するための任意の例を見つけることができませんでした(おそらくので、「aptの」が実行されていません)。私が見つけたすべての例は、InstrumentationテストやRoboelectric(基本的にアクティビティやその他のAndroid関連の項目をモックする)に依存していますが、これは私のUIテストに過ぎません。

私はアプリ - > src-> testフォルダではなく、アプリケーション - > src-> androidTestにあるテストについて話しています。

私は何か問題がありますか?または何かが欠けている? Dagger 2を通常の単体テストでどのように使用するか説明したり例を挙げたりできますか?

答えて

4

私の解決策があなたのために働くかどうかはわかりませんが、私はそれをすべきではありません。 まず、私は私が前の方法で注入を追加し、私のユニットテストtestInjectionComponent

@Singleton 
@Component(modules = {MockNetworkModule.class}) 
public interface MockInjectionComponent extends InjectionComponent { 
void inject(DaggerUnitTest daggerUnitTest); 
} 

を作成しました。そうですね:

@Before 
public void setUp() throws Exception { 
    MockInjectionComponent mockInjectionComponent = DaggerMockInjectionComponent 
      .builder() 
      .mockNetworkModule(new MockNetworkModule()) 
      .build(); 
    mockInjectionComponent.inject(this); 
} 

次に、私は注釈したオブジェクトに注釈を付けます。

EDIT: はあなたのapp.gradleファイルでtestApt "com.google.dagger:dagger-compiler:$daggerVersion"を追加することを忘れないでください。

+0

すでに試しました。 DaggerMockInjectionComponent.builder()を呼び出そうとするとコンパイルされません... "エラー:(41,54)エラー:シンボルメソッドビルダー()を見つけることができません..."ここにGithubのリファレンスがあります:https ://github.com/ivelius/BitcoinGraph/blob/4b9080229f9a2f9c5362b4930bab3dcb979e9e08/app/src/test/java/com/example/yanbraslavski/bitcoingraph/MainPresenterTest.java#L43 – Ivelius

+0

@Ivelius Daggerの前にDaggerMockAppComponentを追加する必要があります。あなたのプロジェクトでDaggerがファイルを生成することができ、インポートを促すプロンプトが表示されます。 –

+0

確かに、ちょうどタイプミスでした。私は修正を約束した。それはまだ同じです...コンパイルしません。あなたはこの小規模なテストプロジェクトをチェックアウトして自分で見ることができます... https://github.com/ivelius/BitcoinGraph/blob/DaggerTests/app/src/test/java/com/example/yanbraslavski/bitcoingraph/MainPresenterTest。 java – Ivelius

2

プレゼンターをテストするためのダガーは必要ありません。 Daggerの仕事は、クラスの依存関係を完全に埋めることです(依存関係注入)。例えば

あなたはこのプレゼンターを持っている:

public class MyPresenter { 

    Database database; 
    ApiService apiService; 

    @Inject 
    public MyPresenter(final Database database, final ApiService apiService) { 
     this.database = database; 
     this.apiService = apiService; 
    } 
} 

ダガーは、それらを使用するあなたのプレゼンターのためのdatabaseapiServiceオブジェクトを使用してプレゼンターを提供します。実際のアプリ(テストではない)を実行すると、これらは実際の機能を持つ実際のオブジェクトになります。

プレゼンターをテストするときは、プレゼンターのみをテストする必要があります。他のものはすべて嘲笑してください。

PresenterTestにプレゼンターを作成するときは、databaseapiServiceの模擬バージョンで作成します。

次に、あなたのプレゼンターが

することにより、これらのオブジェクトとどのように相互作用するかをテストすることができます。オブジェクトの振る舞いを模擬する。

when(database.getSomething()).thenReturn(something) 

b。あなたのプレゼンターを確認すると、それが

verify(database).saveSomething() 

(擬似コード)のように、これらのオブジェクトとMockitoだろう模擬するための標準的な方法をやりたいん。

+0

ありがとうございました。これはまさに私が現在行っていることです。しかし、私のモジュール(実際のモジュールとテストモジュール)を交換するためにダガーを使用できない場合、自分のプロジェクトでDIを使用する主な理由の1つが緩んでいます。私は、これらの模擬データベースとapiServiceオブジェクトが短剣によって「提供される」テストモジュールを定義したいと考えています。それがDIの要点です! – Ivelius

+2

これが現在の作業であれば、そのまま続けてください。 他のユニットテスト用のテストコンポーネントが必要だと思って、いくつかのコードを投稿した理由を説明してください:) – FWeigl

+0

おそらくコードについては分かりませんが、DIの中核的な理解についてはもっと分かります。 DIがテスト可能なコードを書くのを簡単にすることは秘密ではありません。ウィキペディアのDIの定義を確認してください。私たちがテスト中にプレゼンターに自分自身でパラメータを注入しているのであれば、私たちはDIデザインパターンの「インジェクタ」としてバティック的に働いています。なぜフレームワークを使用しないのですか? Daggerでモジュールを交換する必要があるのであれば、異なるモジュールが必要なのはなぜですか? – Ivelius

0

実際のモジュールを偽のモジュールと交換するには、google architecture samplesの推奨に従ってフレーバを使用してコンパイルするか、実行時に本物のものを注入してテストコードで偽の依存関係を生成する抽象メソッドを作成します。 2番目のケースでは、テストでスクラッチからコンポーネントを作成してビルドするクラスをサブクラス化する必要があります。

+0

フレーバーを使用して私のモジュールを置き換えるとき、私は短剣を使わなくてもそれを行うことができます。 googleの例で示唆されているように、彼らは単にプロバイダのように動作するInjectorクラスの異なるバージョンを持っています。基本的に彼らはDaggerなしでDIを行います。問題は、これをどのようにして短剣で行うかです。一般に 。 DaggerでDIを行うための回避策が必要な場合、なぜDaggerが必要なのですか? :D – Ivelius

関連する問題