2

XML データ ファイルに対するテストのみの依存関係を宣言し、クラスパスからファイルをロードする Gradle プロジェクトがあります。コマンド ラインから Gradle で直接テストを実行すると、すべて正常に動作しますが、「gradlew eclipse」を実行すると、Eclipse でプロジェクトを更新し、Eclipse からテストを実行してみてください (Debug As -> JUnit Test)。テストは失敗します。これは、XML ファイルが見つからず、クラスパス ([デバッグ] ビューのプロセスの [プロパティ] コンテキスト メニュー項目からアクセス) に、XML ファイルがクラスパスに含まれていることを示す兆候がないためです。

私が見ている動作にはhttp://gradle.1045684.n5.nabble.com/gradle-junit-tests-resources-and-classpath-td4418753.html#a4420758との共通点がありますが、ショーンの問題は逆でした:彼のテストは Ant では適切に実行されましたが (ただし、Eclipse JUnit プラグインから直接実行しようとしていることについては言及されていませんでした)、Gradle では実行されませんでした。

build.gradle の関連部分は次のとおりです。

依存関係 { testCompile グループ: 'com.mycompany', 名前: 'MyConfigFile', バージョン: '0.0.0+dirty', ext: 'xml' }

URLClasspathLoader がファイル システムから直接ロードできる唯一のリソースは JAR であるため、次の静的メソッドを使用して、ロードする必要があるファイル名に一致するファイルのクラスパスを検索します。

public static String getFullPathForResourceDirectlyOnClasspath(String nameFragment) {
    ClassLoader cl = ClassLoader.getSystemClassLoader();
    for (URL url: ((URLClassLoader)cl).getURLs()){
        String fullPath = url.getFile();
        if (fullPath.contains(nameFragment)) {
            return fullPath;
        }
    }
    return null;
}

そのメソッドを次のように呼び出します。

getFullPathForResourceDirectlyOnClasspath("/MyConfigFile-");

そのコードを Gradle から実行すると (「gradlew ビルド」)、ファイルが検出され、テストが成功します。Eclipse から実行すると (Debug As -> JUnit Test)、クラスパスでそのファイルを見つけることができず (Eclipse JUnit プラグインがそこに配置しないため)、その呼び出しは null を返します。

構成を testCompile から compile に変更して、違いが生じるかどうかを確認しようとしましたが、何も変更されません (そして、おそらく、.classpath には、コンパイル構成が選択されています)。

これを機能させる方法を知っている人はいますか?明らかなはずの何かが欠けているだけですか?

4

1 に答える 1

1

クラス パスを悪用して、単一の引数 (XML ファイルの絶対ファイル パス) をテストに渡しているようです。代わりに、XML ファイルを (テスト) クラス パスに正しい方法で配置し (クラス パスにリストされているディレクトリまたは Jar ファイルに移動する必要があります)、正しくロードする必要があります (例: を使用getClass().getClassLoader().getResource("some/resource.xml"))。テストへのファイル パスをシステム プロパティとして指定します。当然、後者はさまざまな環境 (Gradle ビルドと IDE など) で機能させるのが難しくなります。

于 2013-09-30T19:20:01.500 に答える