(Gradle)ClassNotFoundException为新源集运行testNG测试任务时

时间:2014-01-26 01:44:18

标签: java build gradle gradlew

我有自己的源集,它使用了一些主要来源:

sourceSets {
    special {
            java {
                source main.java
            }
    }

我确保它可以编译并正常运行:

configurations {

    specialCompile.extendsFrom(compile)
    specialRuntime.extendsFrom(runtime)

}

我有自己的测试任务:

task heavyTest(type: Test) {
    useTestNG()         
    testClassesDir  = project.sourceSets.special.output.classesDir
    testSrcDirs    += project.sourceSets.special.java.srcDirs.toList()
}

特殊来源包含org.me.ImportantTests类中的测试方法

编译工作和测试也在eclipse中成功运行,但是当我尝试从gradle执行heavyTest任务时它失败

01:18:23.360 [ERROR] [system.err] 01:18:23.357 [ERROR] [system.err] [TestNG] [ERROR] No test suite found. Nothing to run
01:18:23.488 [QUIET] [system.out] 01:18:23.486 [QUIET] [system.out] Usage: <main class> [options] The XML suite files to run

使用-d运行显示gradle遇到ClassNotFoundException:

01:18:23.559 [DEBUG] [TestEventLogger]         Caused by:
01:18:23.559 [DEBUG] [TestEventLogger]         org.gradle.api.GradleException: Could not load test class 'org.me.ImportantTests'.
01:18:23.560 [DEBUG] [TestEventLogger]             at org.gradle.api.internal.tasks.testing.testng.TestNGTestClassProcessor.processTestClass(TestNGTestClassProcessor.java:67)
01:18:23.561 [DEBUG] [TestEventLogger]             at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:49)
01:18:23.561 [DEBUG] [TestEventLogger]             ... 21 more
01:18:23.561 [DEBUG] [TestEventLogger]
01:18:23.562 [DEBUG] [TestEventLogger]             Caused by:
01:18:23.563 [DEBUG] [TestEventLogger]             java.lang.ClassNotFoundException: org.me.ImportantTests

看起来.class文件不在类路径中......但是我正确地设置了testClassesDir,而且这个类正好在它的位置(/org/me/ImportantTests.class)!这个任务有什么问题?

1 个答案:

答案 0 :(得分:1)

好的,我注意到我可以通过以下方式解决这个问题:

task integTest2(type: Test) {
    useTestNG()
    testClassesDir  = project.sourceSets.special.output.classesDir
    classpath = classpath.plus(files(testClassesDir))
    testSrcDirs    += project.sourceSets.special.java.srcDirs.toList()
}

这很有效,但看起来很......愚蠢。为什么我需要告诉测试任务,那个要测试的类的目录应该在classpath上? “请测试该目录中的类。哦,顺便说一句,加载它们,尝试查看它们所在的目录”。我做错了吗?