【问题标题】:(Gradle) ClassNotFoundException when running testNG test task for new source set(Gradle) 为新源集运行 testNG 测试任务时出现 ClassNotFoundException
【发布时间】:2014-01-27 17:21:04
【问题描述】:

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

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)!这个任务有什么问题?

【问题讨论】:

    标签: java build gradle gradlew


    【解决方案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 是完整的类路径,因此还需要包含测试类。 testClassesDir 是附加的可选信息,用于测试类扫描等目的。
    • 可选?如果未提供此信息,该任务是否能够进行任何测试?将其放入文档中可能是个好主意(或者只是将此属性和类路径添加到 DSL 参考页面上的示例中)以避免任何混淆。
    • 测试任务的类路径上的内容完全由配置任务的一方确定(例如java 插件)。如果存在则使用包含/排除模式(java 插件不添加任何模式)。
    猜你喜欢
    • 2019-11-08
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    • 2017-10-30
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多