Quarkus中Pact契约测试:POM.xml导入Java类失败求助
Quarkus + Pact契约测试:自动生成认证Token的类加载问题解决
问题背景
基于Quarkus的Java应用做Pact契约测试时,接口要求带授权头访问。官方方案是手动给每个请求加授权头,但Token过期后需要手动重新生成替换,效率极低。
尝试通过自定义OAuthTokenRequest类(已编译为class文件,位于test-classes目录)自动生成Token,在pom.xml的requestFilter中用Groovy脚本调用该类方法,但契约验证时始终报类找不到的错误,使用硬编码Token则正常运行。
相关信息
项目目录结构
src/ ├── main/ │ └── java/ │ └── com/yourcompany/ │ └── service/ ├── test/ │ ├── java/ │ │ └── com/yourcompany/ │ │ └── pact/ │ │ └── OAuthTokenRequest.java │ └── resources/ │ └── pacts/ └── target/ └── test-classes/ └── com/yourcompany/pact/ └── OAuthTokenRequest.class
pom.xml代码片段
<plugin> <groupId>au.com.dius.pact.provider</groupId> <artifactId>maven-pact-provider-plugin</artifactId> <version>4.6.1</version> <configuration> <serviceProviders> <serviceProvider> <name>YourService</name> <protocol>http</protocol> <host>localhost</host> <port>8081</port> <path>/</path> <requestFilter> <groovy> import com.yourcompany.pact.OAuthTokenRequest def token = OAuthTokenRequest.generateToken() request.addHeader('Authorization', "Bearer ${token}") </groovy> </requestFilter> </serviceProvider> </serviceProviders> </configuration> </plugin>
报错信息
groovy.lang.MissingPropertyException: No such property: OAuthTokenRequest for class: Script1 at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:65) at org.codehaus.groovy.runtime.callsite.PogoGetPropertySite.getProperty(PogoGetPropertySite.java:51) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGroovyObjectGetProperty(AbstractCallSite.java:341)
解决方案
方案1:为Groovy脚本配置正确的类路径
Pact Maven插件默认未将test-classes目录加入Groovy脚本的类加载路径,需显式配置:
修改pom.xml中的插件配置,添加classpathElements节点,包含测试类和主类输出目录:
<plugin> <groupId>au.com.dius.pact.provider</groupId> <artifactId>maven-pact-provider-plugin</artifactId> <version>4.6.1</version> <configuration> <serviceProviders> <!-- 保留原serviceProvider配置 --> </serviceProviders> <classpathElements> <classpathElement>${project.build.testOutputDirectory}</classpathElement> <classpathElement>${project.build.outputDirectory}</classpathElement> </classpathElements> </configuration> <!-- 若OAuthTokenRequest依赖第三方库,需在此声明依赖 --> <dependencies> <dependency> <groupId>com.yourcompany</groupId> <artifactId>your-oauth-dependency</artifactId> <version>1.0.0</version> <scope>test</scope> </dependency> </dependencies> </plugin>
方案2:改用Java类实现RequestFilter(更稳定)
Groovy脚本的类加载问题容易踩坑,推荐直接用Java类实现Pact的RequestFilter接口:
- 编写Java过滤器类:
package com.yourcompany.pact; import au.com.dius.pact.provider.RequestFilter; import org.apache.http.HttpRequest; public class AuthRequestFilter implements RequestFilter { @Override public void filter(HttpRequest request) { String token = OAuthTokenRequest.generateToken(); request.addHeader("Authorization", "Bearer " + token); } }
- 修改pom.xml配置,替换Groovy脚本为Java过滤器类:
<serviceProvider> <name>YourService</name> <protocol>http</protocol> <host>localhost</host> <port>8081</port> <path>/</path> <requestFilterClass>com.yourcompany.pact.AuthRequestFilter</requestFilterClass> </serviceProvider>
方案3:确保编译顺序正确
执行测试前先编译测试类,避免Pact插件执行时类未生成:
mvn test-compile pact:verify
同时检查target/test-classes目录下是否存在正确的OAuthTokenRequest.class文件,确保编译无错误。
内容的提问来源于stack exchange,提问作者Railane Passos
相关产品推荐
相关产品推荐

