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

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接口:

  1. 编写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);
    }
}
  1. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 06:13:36