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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 05:45:30