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的支持:
- 更新Karate依赖:
testImplementation('com.intuit.karate:karate-junit4:1.4.1') { // 排除Karate自带的JUnit依赖,避免与项目现有JUnit4冲突 exclude group: 'junit', module: 'junit' } - 调整ParallelRunner代码(可选,旧API仍兼容,推荐使用新API):
将原Runner.parallel(getClass(), 10)替换为:Results results = Runner.builder() .path(getClass()) .tags("~@newFeature", "~@ignore", "~@50Test") // 替代@KarateOptions注解 .parallel(10); - 解决JUnit4测试报错:
若升级后出现JUnit相关错误,检查项目中JUnit依赖版本是否统一,确保所有测试模块使用相同版本的JUnit4(如4.13.2),并排除其他依赖引入的冲突JUnit版本。
方案3:临时降级Java版本到11
若项目允许,将Java版本降级到11(LTS版本,自带Nashorn引擎),Karate 0.9.6可直接正常运行,无需任何配置修改。此方案适合短期内无法升级依赖或调整配置的场景。
内容的提问来源于stack exchange,提问作者shruthi Muralidhara
相关产品推荐
相关产品推荐

