如何通过BDD脚本调用gRPC?(基于Cucumber BDD与Camel)
通过BDD脚本结合Camel调用gRPC的实现方案
针对你的场景——已能用grpcurl成功调用gRPC服务,现在要基于BDD框架(以常用的Cucumber为例)结合Camel的gRPC组件实现脚本调用,具体步骤如下:
1. 引入依赖
首先在项目中添加Camel gRPC组件和BDD框架的依赖(以Maven为例):
<!-- Camel gRPC核心组件 --> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-grpc</artifactId> <version>适配你的Camel版本</version> </dependency> <!-- Cucumber BDD测试依赖 --> <dependency> <groupId>io.cucumber</groupId> <artifactId>cucumber-java</artifactId> <version>适配你的Cucumber版本</version> <scope>test</scope> </dependency> <dependency> <groupId>io.cucumber</groupId> <artifactId>cucumber-junit</artifactId> <version>适配你的Cucumber版本</version> <scope>test</scope> </dependency> <!-- Protobuf相关依赖(若未引入) --> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>适配你的Protobuf版本</version> </dependency>
2. 编写BDD场景定义(Feature文件)
用Gherkin语法描述gRPC调用场景,示例如下:
Feature: gRPC服务调用验证 Scenario: 调用service_in_proto.func方法并校验返回结果 Given 构造gRPC请求参数为: {"requestField": "testData"} When 调用localhost:8080上的service_in_proto.func服务 Then 返回结果的responseField字段值为"expectedResult"
3. 配置Camel gRPC路由
创建Camel路由,映射gRPC服务的调用配置,对应你之前grpcurl的参数:
import org.apache.camel.builder.RouteBuilder; public class GrpcInvocationRoute extends RouteBuilder { @Override public void configure() throws Exception { // 定义触发gRPC调用的路由 from("direct:invokeGrpcService") // 配置gRPC端点,对应grpcurl的参数 .to("grpc://localhost:8080/service_in_proto.func" + "?protoFileName=functionsNservices_file_java.proto" + "&plaintext=true") .log("gRPC服务返回结果: ${body}"); } }
注意:确保functionsNservices_file_java.proto文件放在项目的src/main/resources或src/test/resources目录下,让Camel能加载到。
4. 实现BDD步骤绑定
将Feature文件中的Gherkin步骤与具体的gRPC调用逻辑绑定,示例代码:
import io.cucumber.java.en.Given; import io.cucumber.java.en.Then; import io.cucumber.java.en.When; import org.apache.camel.CamelContext; import org.apache.camel.ProducerTemplate; import org.apache.camel.impl.DefaultCamelContext; import com.your.package.proto.YourRequest; // 替换为proto生成的请求类 import com.your.package.proto.YourResponse; // 替换为proto生成的响应类 import com.fasterxml.jackson.databind.ObjectMapper; import java.util.Map; public class GrpcStepBindings { private final CamelContext camelContext; private final ProducerTemplate producerTemplate; private YourRequest grpcRequest; private YourResponse grpcResponse; public GrpcStepBindings() throws Exception { camelContext = new DefaultCamelContext(); camelContext.addRoutes(new GrpcInvocationRoute()); camelContext.start(); producerTemplate = camelContext.createProducerTemplate(); } @Given("构造gRPC请求参数为: {string}") public void buildGrpcRequest(String jsonParams) throws Exception { // 将JSON参数转换为proto生成的请求对象 Map<String, Object> paramMap = new ObjectMapper().readValue(jsonParams, Map.class); grpcRequest = YourRequest.newBuilder() .setRequestField(paramMap.get("requestField").toString()) .build(); } @When("调用localhost:8080上的service_in_proto.func服务") public void invokeGrpcService() { // 发送请求到Camel路由,触发gRPC调用 grpcResponse = producerTemplate.requestBody("direct:invokeGrpcService", grpcRequest, YourResponse.class); } @Then("返回结果的responseField字段值为{string}") public void verifyGrpcResponse(String expectedValue) { // 校验返回结果 assert grpcResponse != null; assert grpcResponse.getResponseField().equals(expectedValue); } }
提示:请替换代码中com.your.package.proto下的请求/响应类,这些类是通过Protobuf插件编译你的functionsNservices_file_java.proto文件生成的。
5. 运行BDD测试
创建JUnit运行类来执行Cucumber测试:
import io.cucumber.junit.Cucumber; import io.cucumber.junit.CucumberOptions; import org.junit.runner.RunWith; @RunWith(Cucumber.class) @CucumberOptions( features = "src/test/resources/features", // 指定Feature文件路径 glue = "com.your.package.steps" // 指定步骤绑定类所在包 ) public class GrpcBddTestRunner { }
运行这个类即可触发BDD场景执行,自动调用gRPC服务并验证结果。
核心注意事项
- 确保Protobuf生成的Java类正确引入,请求/响应的序列化要和gRPC服务端一致。
- 如果gRPC服务需要TLS认证,可在Camel gRPC端点添加
sslContextParameters配置,替换当前的plaintext=true。 - 若proto文件不在默认资源目录,可通过
protoFileLocation参数指定文件路径。
内容的提问来源于stack exchange,提问作者Rog Boy
相关产品推荐
相关产品推荐

