2016-05-06 1 views
10

私は、ライブラリモジュールが2つあり、foo-modulebar-moduleのAndroid Studioプロジェクトを持っています。それぞれは、foo-moduleが戦略インタフェースを定義し、bar-modulefoo-moduleに依存し、そのような戦略を実装するライブラリを実装します。 foo-moduleには、スタブ戦略の実装を使用してコアコードをテストするための計測テスト(foo-module/src/androidTest/)があり、bar-moduleには独自の計測テストが必要です。Androidライブラリモジュール間でテストクラスを継承するにはどうすればよいですか?

実際のテストのほとんどを行うfoo-module/src/androidTest/AbstractTestsクラスを定義しました。私はまた、foo-module/src/androidTest/StubTestsクラスを持っており、AbstractTestsを拡張し、テストケースを完了するために必要なメソッドを実装します(ストラテジの実装などを提供します)。これはすべて素晴らしいです。 bar-module/src/androidTest/

、私はStubTestsをミラーが、bar-moduleに実装戦略を提供するように設計BarStrategyTestsクラスを作成しました。しかし、build.gradleファイルにcompile project(':foo-module')があり、bar-moduleのメイン(非テスト)クラスはfoo-moduleのメイン(非テスト)クラスで正常に動作しますが、BarStrategyTestsAbstractTestsを見ることができません。 IOWは、project()依存関係が正規コードを処理していますが、androidTest/コードを処理しません。私は "error:package com.commonsware.foo.test does not exist"というメッセージが表示されます。

androidTestCompile project(':foo-module')も追加しましたが、同じ結果が出ました。

モジュール間で計装テストコードを共有するためのレシピは?

一時的に、私はAbstractTestsをクローンできますが、それは長期的な解決策ではありません。

This SO questionは、通常のJavaの場合と同じです。誰もがthe one answerのオプションを試して、Androidの計装テストで動作させるようにしましたか?最初のオプション(一般的なテストコードを通常の非テストコードとして別のモジュールに移動する)は妥当と思われますが、javaプラグインの代わりにcom.android.libraryプラグインでうまく動作するかどうかはわかりません。

+0

これを達成する方法を見つけましたか?テストクラスを他のモジュールでも利用できるようにしたいが、リソースを共有するのは難しい。 – karate

+1

@karate:私は受け入れられた答えに概説されているアプローチを使用しています。 – CommonsWare

答えて

8

すべてのテストクラス(ユニットと計測器)は、aarを含むすべてのモジュールの一部ではないため、そのモジュールへの依存性を介して利用できません。この問題に直面して、test-moduleを作成してそれを解決し、必要なすべてのクラスをその中に入れました(src/main/java)。 あなたの場合、AbstractTestsをこのモジュールに移動し、このモジュールをandroidTestCompileの依存関係として使用することができます。

+0

リポジトリのアーティファクトなど、あらかじめパッケージ化されたAARに依存していた場合、別のことをする必要があることは間違いありません。 'compile project( ':foo-module')'が適切なソースセットにマッチすると期待していました。結局 'projectButJustTheMainSourcesetPlease( ':foo-module')'をコンパイルしていません。 :-)私はこれをしばらく開いて、他の誰かが別の選択肢を持っているかどうかを見極めるつもりですが、もしあなたのことが最善の選択肢になるなら、私はショックを受けません。助けてくれてありがとう! – CommonsWare

+1

このアプローチは複数の追加モジュールを必要とするように見えることに注意してください。基本的に、 'foo-module'はそれ自身のテストを行うことはできません。'AbstractTests'は' foo-module-test-common'に移動するだけでなく、 'foo-module'の以前のテストは' foo-module-test'に移動させる必要があります。 'foo-module'は' foo-module-test-common'に 'androidTestCompile'を持っています。これは' foo-module'に 'compile'をしています。 'foo-module'は結果として' foo-module-test-common'に依存することはできません。何が痛い。 – CommonsWare

+2

さて、 'foo-module-test-common'に依存する' foo-module'は避けなければなりません。 1つのオプションは 'foo-module'から' foo-module-test-common'にすべてのテストを移動することです。このモジュールは 'src/main/java'に共通のテストクラスを含むだけでなく、' foo 'src/androidTest/java'に' -module'を追加します。 –

関連する問題