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

Java 17+Quarkus+GRPC集成PACT测试报错求助

解决Pact集成gRPC时"Pact file does not contain any Protobuf descriptors"错误

以下是针对Java 17 + Quarkus + Maven技术栈的排查和解决步骤:

1. 确保Protobuf描述符正确生成并配置

Pact gRPC插件需要读取编译后的Protobuf描述符文件(.desc)才能识别消息结构,你需要:

  • 在Maven的protobuf-maven-plugin中添加描述符输出配置,确保编译时生成.desc文件:
    <plugin>
      <groupId>org.xolstice.maven.plugins</groupId>
      <artifactId>protobuf-maven-plugin</artifactId>
      <version>0.6.1</version>
      <configuration>
        <!-- 指定描述符输出路径,确保测试代码能访问到 -->
        <descriptorSetOutput>target/classes/your/service/descriptor.desc</descriptorSetOutput>
        <includeDependenciesDescriptorSet>true</includeDependenciesDescriptorSet>
      </configuration>
      <executions>
        <execution>
          <goals>
            <goal>compile</goal>
            <goal>compile-custom</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
    
  • 在测试类的@PactTestFor注解中明确指定描述符路径:
    @PactTestFor(properties = {
      "pact:protobuf-config.descriptors=target/classes/your/service/descriptor.desc"
    })
    public class YourGrpcPactTest {
      // 测试代码
    }
    
    注意路径要与插件生成的位置完全匹配,多模块项目需调整为相对于测试模块的路径。

2. 检查Pact交互定义是否正确

确保你在@Pact方法中使用Protobuf生成的消息类来构建请求和响应,而非手动构造JSON:

@Pact(provider = "grpc-provider", consumer = "grpc-consumer")
public RequestResponsePact createTestPact(PactDslWithProvider builder) {
  // 使用Protobuf生成的请求/响应类
  UserRequest request = UserRequest.newBuilder().setUserId(1001).build();
  UserResponse response = UserResponse.newBuilder().setUserName("test-user").build();

  return builder
    .given("user exists")
    .uponReceiving("get user request")
    .grpcRequest()
    .withMethod("UserService/GetUser") // 格式:服务名/方法名
    .withMessage(request)
    .willRespondWith()
    .grpcResponse()
    .withMessage(response)
    .toPact();
}

3. 验证依赖版本兼容性

确保Pact gRPC相关依赖版本与Java 17、Quarkus兼容,建议使用最新稳定版(如4.6.1+),避免依赖冲突:

<dependency>
  <groupId>au.com.dius.pact.provider</groupId>
  <artifactId>pact-jvm-provider-grpc</artifactId>
  <version>4.6.1</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>au.com.dius.pact.consumer</groupId>
  <artifactId>pact-jvm-consumer-grpc</artifactId>
  <version>4.6.1</version>
  <scope>test</scope>
</dependency>

4. 清理并重新构建项目

执行以下命令清除旧编译产物和Pact缓存,再重新运行测试:

mvn clean install -DskipTests
mvn test

可以在测试代码中添加日志输出,确认描述符文件的读取路径是否正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 01:04:55