我的空手道测试不是 java 项目的一部分。我针对外部部署的 java 微服务(源自我称为
serviceName
的 jvm 属性)运行它们。我用这样的命令来做到这一点:
java -Dkarate.env=qa -DserviceName=aca-retention -cp './karate.jar:.' com.intuit.karate.Main --tags @tier1 --threads 3 .
.feature 文件位于当前工作目录中及其下方。 类路径包括当前工作目录,因为那是我编译自定义 java 类的地方,我用它来屏蔽日志中的内容。这效果很好。
现在,我需要在java代码中实现一些测试逻辑,所以我有另一个java类要编译,它依赖于aws sdk。 但是,当我尝试通过 karate 调用 java 的能力来调用它时,我不知道如何让我的类工作。
我尝试制作一个独立的 spring-boot 项目,其中包括我的一个自定义 java 类和 aws sdk 依赖项。但是,当我尝试从空手道功能中调用它时,我得到 像这样的错误:
12:54:59.939 tier2/aca-retention/fixed-retention.feature:39
* def S3ObjectRetention = Java.type('com.nm.aca.test.S3ObjectRetention')
js failed:
>>>>
01: Java.type('com.nm.aca.test.S3ObjectRetention')
<<<<
org.graalvm.polyglot.PolyglotException: TypeError: Access to host class com.nm.aca.test.S3ObjectRetention is not allowed or does not exist.
- <js>.:program(Unnamed:1)
tier2/aca-retention/fixed-retention.feature:39
第 39 行看起来像这样:
* def S3ObjectRetention = Java.type('com.nm.aca.test.S3ObjectRetention')
我还尝试自行编译我的自定义java类,并通过类路径包含aws sdk jar,但是当我运行空手道时,它失败并出现如下错误:
* def retainUntil = S3ObjectRetention.get(s3BucketName, s3ObjectKey)
js failed:
>>>>
01: S3ObjectRetention.get(s3BucketName, s3ObjectKey)
<<<<
org.graalvm.polyglot.PolyglotException: software/amazon/awssdk/services/s3/S3Client
- S3ObjectRetention.get(S3ObjectRetention.java:9)
- <js>.:program(Unnamed:1)
tier2/aca-retention/fixed-retention.feature:40
其中功能文件的第 39 行和第 40 行是这样的:
* def S3ObjectRetention = Java.type('S3ObjectRetention')
* def retainUntil = S3ObjectRetention.get(s3BucketName, s3ObjectKey)
java 文件的第 9 行是尝试使用 aws sdk 类的 java 的第一行:
S3Client s3Client = S3Client.builder()
.region(Region.US_EAST_1) // Specify your desired AWS region
.build();
有人知道我错过了什么或做错了什么吗?我应该尝试使用 maven 来运行我的空手道测试而不是 java 命令吗?
谢谢!