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

Quarkus开发模式下如何优雅Mock含gRPC客户端的Bean?

问题

我的Quarkus应用里有个包含gRPC客户端的Bean:

@ApplicationScoped
@Slf4j
public class AuthorizationAdapter implements AuthorizationPort {

    private final AuthorizationGrpc.AuthorizationBlockingStub authorizationBlockingStub;

    public AuthorizationAdapter(
            @GrpcClient("authorization") AuthorizationGrpc.AuthorizationBlockingStub authorizationBlockingStub) {
        this.authorizationBlockingStub = authorizationBlockingStub;
    }

    @Override
    public boolean canActorReadReport(Actor actor, UUID reportId) {
        // 这里调用authorizationBlockingStub的逻辑
    }
}

测试时我用下面的类Mock这个Bean:

@ApplicationScoped
@Mock
public class MockAuthorizationAdapter implements AuthorizationPort {

    @Override
    public boolean canActorReadReport(Actor actor, UUID reportId) {
        return true;
    }
}

但开发模式下我也想达到同样的效果——我不想启动真实的gRPC服务器。我知道可以给原Bean加@IfBuildProfile("prod")注解然后写个Mock版本,但这样会污染src/main/java,我不想这么做。有没有更优雅的办法?

解决方案

给你几个不用污染主源码的优雅方案,实现开发模式下Mock gRPC客户端Bean的需求:

方案1:用@Alternative + 开发模式专属注解

  1. 原AuthorizationAdapter保持原样,不用加任何环境相关注解
  2. 改造Mock类,加上@Alternative和@BuildProfile("dev")注解,把它放在src/main/java下的专属包(比如com.yourpackage.dev):
@ApplicationScoped
@Alternative
@BuildProfile("dev")
public class MockAuthorizationAdapter implements AuthorizationPort {

    @Override
    public boolean canActorReadReport(Actor actor, UUID reportId) {
        return true;
    }
}

这样Quarkus在dev模式下会自动选用这个替代类,生产模式则用原Bean,原业务代码完全不用动,不会污染主源码。

方案2:通过配置文件指定替代类

要是不想把Mock类放在src/main/java,可以把它放在src/test/java目录,然后通过开发模式的配置强制加载:

  1. 给Mock类加上@Alternative注解:
@ApplicationScoped
@Alternative
public class MockAuthorizationAdapter implements AuthorizationPort {

    @Override
    public boolean canActorReadReport(Actor actor, UUID reportId) {
        return true;
    }
}
  1. 在src/main/resources/application-dev.properties里加一行配置:
quarkus.arc.selected-alternatives=com.yourpackage.MockAuthorizationAdapter
  1. 确保启动开发模式时,测试类被包含在编译路径里(可以通过IDE的开发模式配置或者Maven/Gradle的dev任务调整)。这种方式把Mock代码完全隔离在测试目录,主源码零修改。

方案3:用Quarkus Dev Services启动Mock gRPC服务器(可选)

如果需要更贴近真实调用场景的Mock(不是直接Mock接口),可以用Quarkus的Dev Services自动启动一个Mock gRPC服务器,不用手动搭建:

  1. 添加gRPC Mock扩展依赖:
<!-- Maven -->
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-grpc-mock</artifactId>
    <scope>test</scope>
</dependency>
  1. 开发模式下,通过代码或者配置定义Mock的gRPC响应,原AuthorizationAdapter可以正常调用这个Mock服务器,业务代码完全不用改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 08:57:47