1

src\test\resourcesで提供されているリソースではなく、 で提供されているリソースを単体テストで使用するのに問題がありsrc\main\resourcesます。はい、問題のリソースは両方の場所で同じ名前です。

私はかなりの量の調査を行い、次のような StackOverflow の投稿を調べました。

しかし、この基本的な問題は私を困惑させました。

私は非常に標準的な Maven Java プロジェクトをセットアップしています。

  • 以下のアプリケーションソースとリソースsrc\main
  • ソースとリソースのテストsrc\test

Eclipse (M2Eclipse プラグインのおかげ) のビルド パスには、、、およびsrc\main\javaすべてがあります。src\main\resourcessrc\test\javasrc\test\resources

このセットアップでは、Eclipse 内から単体テストを実行すると、リソース ファイルsrc\main\resourcesが参照されます。理由はわかりますが (ビルド パスにあるため)、それを防ぐ方法がわかりません。単体テスト構成パネルでは、(デフォルトの) クラスパス コンポーネントの順序を微調整できません。

自分のテストを Eclipse から実行できないことを大げさに言ったとしても、Maven もうまく動作しません。processResourcesこのステップで、すべてのテスト リソースがtarget\test-classesツリーの下にコピーされていることがわかります。ただし、単体テストが実行されると、下にあるリソース ファイルのコピーがtarget\classes参照されます。

確かに私は明らかな何かを見落としています。あなたが提供できる助けに感謝します。

[編集]さらに追加(おそらく関連情報)

問題のリソース ファイルは、persistence.xml. これは、リレーショナル データ ソースに接続するためにEclipselinkによって使用されます。アプリケーションが使用するファイルのバージョンは、src\main\resources\META-INF. Maven ビルド (WAR など) は、META-INFディレクトリをディレクトリの下に配置しclassesます。したがって、EclipseLink ツールはこのファイルを検出します。

src/main
  |
  + -- java/com/company/ProductDao.java
  | 
  + -- resources/META-INF/persistence.xml  (Requires application container)
  |
src/test
  |
  + -- java/com/company/ProductDaoTest.java
  | 
  + -- resources/META-INF/persistence.xml  (out of container for unit tests)
  |

ここでのポイントは次のとおりです。EclipseLink は、クラスパス上のディレクトリでpersistence.xml呼び出さMETA-INFれるファイルを必要とします(はい、デフォルトはオーバーライドできますが、そこには行きません)。

したがって、単体テストが実行されると、同じアプリケーション ロジックが呼び出されます。ただし、ファイルのバージョンはsrc\main\resources使用できません。別のバージョンsrc\test\resourcesディレクトリで使用可能になります。

のバージョンsrc\main\resources使用されているため、私の唯一の手段は、単体テスト中にEclipselinkに別のファイル名を探すように指示することです。

4

2 に答える 2

1

これは、根本的な Maven の問題ではありません。すべてを 1 つのソース フォルダーにまとめた場合、まったく同じ問題が発生します。あなたが本当に何をしているのか考えてみてください。単体テストには src/main のコードが必要です。そうしないと、そのコードの単体テストにはなりません。src/main/java と src/main/resources は、テストするアーティファクトを構成します。単体テストのディレクトリを混在させたり一致させたりしないでください。

あなたは基本的にこれをやっています:

/src/com/mycompany/myresource.txt        
/src/com/mycompany/MyAwesomeClass.java
/src/com/mycompany/myresource.txt
/src/com/mycompany/TestMyAwesomeClass.java

そうしないでください。別のファイルからモック データ / リソース ファイルを読み込むように単体テストを構成します。

Maven と Eclipse に問題があったとしても、私は多くのことを経験していません。Maven は魔法ではないことを認識してください。また、Maven と Eclipse を使用する場合は、すべてを POM ファイルで駆動する必要があり、その逆ではありません。その後、物事は美しく機能します。

再確認するために、あなたの問題は Maven とは何の関係もありません。クラスパスでリソースを 2 回宣言しています。単体テストを再考する必要があります。プロファイルを使用してこれを回避するためにできることはありますが、それはビルド システムの悪用です。

于 2012-07-01T12:37:33.853 に答える
0

私は答えた後、もう一度それを理解しようとして少し時間を費やす必要がありました. 確実なドキュメントでは、テストクラスはクラスパスの最初にある必要があると書かれています: http://maven.apache.org/surefire/maven-surefire-plugin/examples/configuring-classpath.html

そして確実に表示されます (mvn --debug オプションを使用): [DEBUG] test classpath:
...\target\test-classes
...\target\classes ....m2\repository\javax\enterprise\cdi-api\ 1.2\cdi-api-1.2.jar
....m2\repository\javax\el\javax.el-api\3.0.0\javax.el-api-3.0.0.jar ...しかし、それでもターゲットを使用します最初にクラス。奇妙なことに、このバグは少し前に報告されました。次に、クラスフォルダーからのpersistence.xmlを何をしても最初に取得します。

そのため、1 つの persistence.xml ファイルで 2 つの永続化ユニットを使用する必要がありましたが、これは最適ではないかもしれませんが、正常に動作します。

于 2014-06-19T13:14:07.773 に答える