6

今日、統合テストを含むプロジェクトをmavenからgradleに切り替えようとしました。私がtestngに深刻な問題を抱えていることを除いて、すべてうまくいきました。

このプロジェクトでは、データベース アクセスに hibernate/JPA2 を使用し、test/resources/META-INF/persistence.xml の永続ユニットに依存するいくつかのテストを行います。gradle を使用してテスト スイートを実行すると、すべて正常に動作します。しかし、Eclipse から xml (またはテスト クラス自体) を実行すると、main/resources/META-INF/persistence.xml を使用しようとしているようです。

私は TDD を使用してほとんどの作業を行っているため、Eclipse からテストを実行/デバッグする必要があります。永続化ユニットを本番のpersistence.xmlに追加すると、機能します(「テスト」ディレクトリから他のリソースを取得することさえあります)。それは回避策ですが、「メイン/リソース」にテストリソースを追加するという考えは本当に好きではありません

Mavenの古いpom.xmlを使用してインポートすると、同じプロジェクトが正常に機能します。

build.gradle

apply plugin: 'java'
apply plugin: 'eclipse'

sourceCompatibility = 1.7
version = '0.1'
jar {
    manifest {
        attributes 'Implementation-Title': 'md', 'Implementation-Version': version
    }
}

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.slf4j:slf4j-api:1.7.5'
    compile 'com.google.guava:guava:14.0.1'
    compile 'org.hibernate:hibernate-entitymanager:4.2.2.Final'
    compile 'org.hibernate.javax.persistence:hibernate-jpa-2.0-api:1.0.1.Final'

    testCompile 'ch.qos.logback:logback-classic:1.0.13'
    testCompile 'org.testng:testng:6.8.5'
    testCompile 'org.dbunit:dbunit:2.4.9'
    testCompile 'org.mockito:mockito-all:1.9.5'
    testCompile 'org.easytesting:fest-assert-core:2.0M10'
    testCompile 'org.hsqldb:hsqldb:2.2.9'

}

test {
    useTestNG(){    
        suites 'src/test/resources/testng.xml' 
    } 
}

アップデート:

生成されたクラスパス ファイルは次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" path="src/main/java"/>
    <classpathentry kind="src" path="src/main/resources"/>
    <classpathentry kind="src" path="src/test/java"/>
    <classpathentry kind="src" path="src/test/resources"/>
    <classpathentry exported="true" kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
    <classpathentry exported="true" kind="con" path="org.springsource.ide.eclipse.gradle.classpathcontainer"/>
    <classpathentry kind="output" path="bin"/>
</classpath>

すべてをbinフォルダーにマージし、mavenによって生成された.classpathファイルのようにメインとテストを区別しないようです。

4

2 に答える 2

13

問題は、gradle の Eclipse プラグインがデフォルトで test フォルダーと main フォルダーをマージすることでした。したがって、main の persistence.xml はテスト バージョンをオーバーライドしました。

次のコードを追加すると、生成されたクラスパス エントリの出力ディレクトリが変更され、デフォルトの出力でエントリが削除され、問題が解決されます。

import org.gradle.plugins.ide.eclipse.model.SourceFolder 
eclipse.classpath.file {
    beforeMerged { classpath -> 
        classpath.entries.clear()
    }
    whenMerged {  cp -> 
        cp.entries.findAll { it instanceof SourceFolder && it.path.startsWith("src/main/") }*.output = "bin/main" 
        cp.entries.findAll { it instanceof SourceFolder && it.path.startsWith("src/test/") }*.output = "bin/test" 
        cp.entries.removeAll { it.kind == "output" }
    }
}

更新: 変更後の関連するクラスパス エントリ。

<classpathentry output="bin/main" kind="src" path="src/main/java"/>
<classpathentry output="bin/main" kind="src" path="src/main/resources"/>
<classpathentry output="bin/test" kind="src" path="src/test/java"/>
<classpathentry output="bin/test" kind="src" path="src/test/resources"/>
于 2013-07-04T07:38:58.660 に答える
1

デフォルトの出力フォルダーを「build」に設定し、テスト出力フォルダーを「build-test」に設定します(Gradle 2.7 でテスト済み):

eclipse.classpath {
    defaultOutputDir = file('build')
    file.withXml { n ->
        n.asNode().classpathentry.findAll { it.@path.startsWith('src/test') }
                .each { it.@output = 'build-test' }
    }
}

結果の .classpath ファイル エントリ:

<classpathentry kind="output" path="build"/>
<classpathentry kind="src" path="src/main/java"/>
<classpathentry kind="src" path="src/main/resources"/>
<classpathentry kind="src" path="src/test/java" output="build-test"/>
<classpathentry kind="src" path="src/test/resources" output="build-test"/>
于 2015-09-30T00:49:21.083 に答える