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
相关产品推荐
相关产品推荐

