1

そのため、Robolectricスタイルの単体テストを支援するために作成したモジュールにいくつかのクラスがあり、このモジュールを他のモジュールの束で共有できるようにしたいと考えています。このモジュールには独自の単体テストがあり、apklibとして設定しました。私はmaven-android-pluginを使用しています。問題は、テストスコープ内のapklibsを認識しないことのようです。これに対する回避策はありますか、それとも何かが足りませんか?

私が気付いていることの1つは、コマンドを実行するmvn installと、すべてがビルドされ、すべてのテストが正常に実行されることですが、実行すると、mvn testクラスが見つからないと表示されます。

4

1 に答える 1

6

Mavenには、この「リアクター」の概念があります。これは、構築中のプロジェクトのリストを表すための単なる空想用語です。Mavenビルドの開始時と終了時に、Mavenはこのプロジェクトのリストを/project/name(定義されているかどうかにかかわらず(XPath)を使用してgroupId:artifactId)出力します。

リアクター内のプロジェクトごとに、Mavenは添付されたアーティファクトのリストを維持します。デフォルトでは、各モジュールpom.xmlがアタッチされており、各プラグインが実行されると、追加のアーティファクトをアタッチするオプションがあります。ほとんどのプラグインはアーティファクトをアタッチしません。アタッチするプラグインは次のとおりです。

  • jar:jarを作成し、.jarそれをプライマリアーティファクトとして添付します(構成で分類子を指定しない限り)
  • war:warを作成し.warて添付します
  • source:jar.jarソースJavaコードのを作成し、の分類子を付加します。source
  • javadoc:jar.jarのJavaDocsを作成し、の分類子を付加します。javadoc
  • android:apklib.apklibアーティファクトを作成し、それをプライマリアーティファクトとして添付します

デフォルトのプライマリアーティファクト(これはjar:jarに置き換えられます)もあります。これは実際にはディレクトリであり、ファイルではないため、ローカルリポジトリキャッシュまたはリモートリポジトリにインストールまたはデプロイされません。

したがって、reactor内で、プライマリアーティファクトをアタッチするプラグインがまだ実行されておらず(あなたの場合android:apklib)、別のプラグインがプライマリアーティファクトを要求すると、ディレクトリが与えられ${project.build.outputDirectory}ます。プライマリアーティファクトがアタッチされた後、そのプライマリアーティファクトが提供されます。

フェーズはtestフェーズの前に発生するpackageため、ではなくディレクトリを渡し.apklibます。

マルチモジュールプロジェクトでは事態はさらに複雑になります(これは私の長いイントロがあなたを助けるはずです)

Mavenはテストクラスパスを構築する必要があります。依存関係の1つがリアクター内にある場合、Mavenはリアクターにアタッチされたアーティファクトを使用します。それ以外の場合は、ローカルキャッシュを使用します(必要に応じてリモートリポジトリからデータを入力します)。

あなたが走るとき

mvn test

ルートからの複数のプロジェクトでは、デフォルトの(ディレクトリベースの)アーティファクトの置き換えはないため、モジュール内のクラスパスはターゲット/クラスディレクトリになります(Androidプラグインはそのようなテストの処理方法を知っていると想定しています) ...そうではないことがわかりました)。

あなたが走るとき

mvn package

また

mvn install

ただし、同じプロジェクトでは、各モジュールがライフサイクルを順番に完了するため、すべての依存モジュールは.apklib、添付されたアーティファクトとしてファイルをスワップインします。

ここでの問題の可能性が最も高いのは、テストがディレクトリで機能せず、実際の.apklibファイルが必要になることです。その場合、ライフサイクルを少なくともpackageフェーズにプッシュする以外に選択肢はありません。

于 2013-01-29T21:29:19.403 に答える