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

如何Stub Cluster Sharding测试Akka HTTP Routes?遇空指针问题

问题解决:Akka分片集群Routes测试system为null及Stub Cluster Sharding方案

一、修复「system为null」错误

你的测试类同时继承JUnitRouteTest又手动创建ActorTestKit,导致系统实例初始化冲突——JUnitRouteTest本身已内置TestKit初始化逻辑,手动创建的实例会打乱初始化顺序,最终引发null异常。

调整核心逻辑

去掉手动创建的ActorTestKit,直接使用JUnitRouteTest提供的system()方法,并通过createActorSystemConfig()注入自定义配置。

二、Stub Cluster Sharding的实现

使用Akka TestKit的TestProbe模拟分片集群的ShardRegion,拦截并模拟分片Actor的响应,完整测试代码示例:

public class WeatherRoutesTest extends JUnitRouteTest {

    private TestRoute weatherRoute;
    private TestProbe shardRegionProbe;

    @Override
    protected Config createActorSystemConfig() {
        return ConfigFactory.parseString("""
                akka.actor.provider = cluster
                killrweather.routes.ask-timeout = 60s
                """);
    }

    @BeforeEach
    public void setup() {
        // 创建测试探针,模拟ShardRegion角色
        shardRegionProbe = TestProbe.create(system());
        
        // 初始化ClusterSharding,替换真实ShardRegion为测试探针
        ClusterSharding sharding = ClusterSharding.get(system());
        sharding.init(
                EntityTypeKey.create(WeatherActor.class, "WeatherActor"),
                ClusterShardingSettings.create(system()),
                // 自定义消息路由逻辑,需匹配你的业务消息类型
                message -> {
                    if (message instanceof WeatherQuery query) {
                        return EntityRef.create("WeatherActor", query.getCityId());
                    }
                    throw new IllegalArgumentException("Unknown message type");
                },
                shardRegionProbe.ref()
        );

        // 初始化测试路由
        WeatherRoutes weatherRoutes = new WeatherRoutes(system());
        weatherRoute = testRoute(weatherRoutes.weather());
    }

    @Test
    public void testWeather() {
        // 预设探针行为:捕获查询消息并返回模拟结果
        shardRegionProbe.expectMsgClass(WeatherQuery.class);
        shardRegionProbe.reply(new WeatherResult(25.0));

        // 执行路由测试并断言结果
        weatherRoute.run(HttpRequest.GET("/weather/62?type=temperature&function=average"))
                .assertStatusCode(StatusCodes.OK())
                .assertEntity("25.0");
    }
}

关键说明

  1. 初始化对齐:通过createActorSystemConfig()提供集群配置,避免手动创建TestKit导致的系统实例冲突,彻底解决system为null问题。
  2. 分片模拟:用TestProbe替代真实的ShardRegion,所有发往分片的消息会被探针捕获,可在测试中灵活控制返回的响应内容。
  3. 路由适配:需根据你的业务消息类型调整路由逻辑,确保探针能正确拦截目标消息。

如果你的WeatherRoutes采用依赖注入方式获取ClusterSharding,可直接在测试中注入Stub的ClusterSharding实例,无需在系统中初始化真实分片,进一步简化测试逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 12:15:26