You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java 17下Karate 0.9.6执行测试报Nashorn空指针问题求助

Karate 0.9.6 + Java 17 并行测试NPE问题及解决方案

错误日志

*<ServiceName>*.ParallelRunner > testParallel FAILED
    java.lang.ExceptionInInitializerError
        at com.intuit.karate.Runner$Builder.tagSelector(Runner.java:80)
        at com.intuit.karate.Runner.parallel(Runner.java:309)
        at com.intuit.karate.Runner$Builder.parallel(Runner.java:190)
        at com.intuit.karate.Runner.parallel(Runner.java:218)
        at com.intuit.karate.Runner.parallel(Runner.java:214)
        at *<ServiceName>*.ParallelRunner.testParallel(ParallelRunner.java:30)

        Caused by:
        java.lang.NullPointerException: Cannot invoke "javax.script.ScriptEngine.createBindings()" because "com.intuit.karate.ScriptBindings.NASHORN" is null
            at com.intuit.karate.ScriptBindings.createBindings(ScriptBindings.java:160)
            at com.intuit.karate.core.Tags.<init>(Tags.java:158)
            at com.intuit.karate.core.Tags.<clinit>(Tags.java:48)
            ... 6 more

1 test completed, 1 failed
Finished generating test XML results (0.006 secs) into: /Users/*<empId>*/<ServiceName>/build/test-results/acceptanceTests
Generating HTML test report...
Finished generating test html results (0.005 secs) into: /Users/*<empId>*/<ServiceName>/build/reports/tests/acceptanceTests

> Task :acceptanceTests FAILED

FAILURE: Build failed with an exception.

环境信息

  • Karate版本:testImplementation 'com.intuit.karate:karate-junit4:0.9.6'
  • Java版本:17
  • 项目依赖JUnit4进行集成/单元测试,升级Karate后会触发大量JUnit4测试报错

执行命令

./gradlew clean acceptanceTest -Dkarate.clientId='<>' \
-Dkarate.clientSecret='<>' \
-Dkarate.abTestMgmt='<>' \
-Dkarate.env='<>' -Dkarate.options="--tags @CRUD_ConfigurationId" --info

ParallelRunner代码

package <serviceName>;

import com.intuit.karate.KarateOptions;
import com.intuit.karate.Results;
import com.intuit.karate.Runner;
import lombok.extern.slf4j.Slf4j;
import net.masterthought.cucumber.Configuration;
import net.masterthought.cucumber.ReportBuilder;
import org.apache.commons.io.FileUtils;
import org.junit.Test;

import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import static junit.framework.TestCase.assertTrue;

@Slf4j
@KarateOptions(tags = {"~@newFeature", "~@ignore", "~@50Test"})
public class ParallelRunner {

    @Test
    public void testParallel() {
        Results results = Runner.parallel(getClass(), 10);
        generateReport(results.getReportDir());
        assertTrue(results.getErrorMessages(), results.getFailCount() == 0);
    }

    public static void generateReport(String karateOutputPath) {
        Collection<File> jsonFiles = FileUtils.listFiles(new File(karateOutputPath), new String[]{"json"}, true);
        List<String> jsonPaths = new ArrayList<>(jsonFiles.size());
        jsonFiles.forEach(file -> jsonPaths.add(file.getAbsolutePath()));
        Configuration config = new Configuration(new File("target"), "<ServiceName>_AcceptanceTest");
        ReportBuilder reportBuilder = new ReportBuilder(jsonPaths, config);
        reportBuilder.generateReports();
    }

}

问题核心

Karate 0.9.6依赖Nashorn JavaScript引擎,而Java 17已移除Nashorn模块,导致初始化ScriptEngine时出现NPE。以下是三种可行解决方案:

方案1:不升级Karate,启用Java17的Nashorn兼容模式

在测试任务中添加JVM参数,强制启用Nashorn模块:

  • 直接在执行命令中追加参数:
    ./gradlew clean acceptanceTest -Dkarate.clientId='<>' \
    -Dkarate.clientSecret='<>' \
    -Dkarate.abTestMgmt='<>' \
    -Dkarate.env='<>' -Dkarate.options="--tags @CRUD_ConfigurationId" --info \
    --jvmArgs "--add-modules jdk.scripting.nashorn --add-exports jdk.scripting.nashorn/jdk.nashorn.api.scripting=ALL-UNNAMED"
    
  • 或者在Gradle的build.gradle中全局配置测试任务:
    test {
        jvmArgs '--add-modules', 'jdk.scripting.nashorn',
                '--add-exports', 'jdk.scripting.nashorn/jdk.nashorn.api.scripting=ALL-UNNAMED'
    }
    

该方案无需修改代码或依赖,快速解决当前报错,但属于临时兼容方案,长期来看不推荐。

方案2:升级Karate到兼容JUnit4的稳定版

Karate 1.x系列(如1.4.1)已移除Nashorn依赖,改用GraalVM JS,完全兼容Java17,同时保留对JUnit4的支持:

  1. 更新Karate依赖:
    testImplementation('com.intuit.karate:karate-junit4:1.4.1') {
        // 排除Karate自带的JUnit依赖,避免与项目现有JUnit4冲突
        exclude group: 'junit', module: 'junit'
    }
    
  2. 调整ParallelRunner代码(可选,旧API仍兼容,推荐使用新API):
    将原Runner.parallel(getClass(), 10)替换为:
    Results results = Runner.builder()
                            .path(getClass())
                            .tags("~@newFeature", "~@ignore", "~@50Test") // 替代@KarateOptions注解
                            .parallel(10);
    
  3. 解决JUnit4测试报错:
    若升级后出现JUnit相关错误,检查项目中JUnit依赖版本是否统一,确保所有测试模块使用相同版本的JUnit4(如4.13.2),并排除其他依赖引入的冲突JUnit版本。

方案3:临时降级Java版本到11

若项目允许,将Java版本降级到11(LTS版本,自带Nashorn引擎),Karate 0.9.6可直接正常运行,无需任何配置修改。此方案适合短期内无法升级依赖或调整配置的场景。


内容的提问来源于stack exchange,提问作者shruthi Muralidhara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 19:30:00