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 + 开发模式专属注解
- 原
AuthorizationAdapter保持原样,不用加任何环境相关注解 - 改造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目录,然后通过开发模式的配置强制加载:
- 给Mock类加上
@Alternative注解:
@ApplicationScoped @Alternative public class MockAuthorizationAdapter implements AuthorizationPort { @Override public boolean canActorReadReport(Actor actor, UUID reportId) { return true; } }
- 在
src/main/resources/application-dev.properties里加一行配置:
quarkus.arc.selected-alternatives=com.yourpackage.MockAuthorizationAdapter
- 确保启动开发模式时,测试类被包含在编译路径里(可以通过IDE的开发模式配置或者Maven/Gradle的dev任务调整)。这种方式把Mock代码完全隔离在测试目录,主源码零修改。
方案3:用Quarkus Dev Services启动Mock gRPC服务器(可选)
如果需要更贴近真实调用场景的Mock(不是直接Mock接口),可以用Quarkus的Dev Services自动启动一个Mock gRPC服务器,不用手动搭建:
- 添加gRPC Mock扩展依赖:
<!-- Maven --> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-grpc-mock</artifactId> <scope>test</scope> </dependency>
- 开发模式下,通过代码或者配置定义Mock的gRPC响应,原
AuthorizationAdapter可以正常调用这个Mock服务器,业务代码完全不用改。
内容的提问来源于stack exchange,提问作者user1549094
相关产品推荐
相关产品推荐

