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

Gatling Java仿真类中HashMap赋值报错问题求助

问题原因

你遇到的错误是因为Java不允许在类的顶级作用域直接执行方法调用语句,map.put("authToken", "token")属于执行语句,不能直接放在成员变量声明之后的类体中,必须放在代码块(初始化块、构造器、方法)内。

解决方案

根据你“顶部声明HashMap,下方填充值”的需求,提供三种常用实现方式:

1. 声明时直接初始化(适合初始值固定的场景)

可以用双括号初始化语法,或者借助Java 9+的Map.of快速构建:

// 双括号初始化
HashMap<String, String> map = new HashMap<>() {{
    put("authToken", "token");
}};

// Java 9+ 简洁写法
HashMap<String, String> map = new HashMap<>(Map.of("authToken", "token"));

2. 使用实例初始化块(适合类实例化时自动填充的场景)

如果需要添加多个值或逻辑较复杂,实例初始化块会在类构造器执行前自动触发:

// 顶部声明HashMap
HashMap<String, String> map = new HashMap<>();

// 下方添加实例初始化块填充值
{
    map.put("authToken", "token");
    // 可继续添加其他键值对
    // map.put("userRole", "teacher");
}

3. 在Gatling场景方法中填充(适合依赖场景变量的动态填充)

如果需要把Gatling会话中获取的token存入map,可以在exec步骤中处理:

// 顶部声明HashMap
HashMap<String, String> map = new HashMap<>();

// 在场景中添加exec步骤填充
ScenarioBuilder scn1 = scenario("auth-flow").repeat(AUTH_FLOW_REPEAT).on(
        feed(teacherFeeder)
                .exec(http("Get Token from IDS")
                        .post(IDS_LOGIN_URL)
                        .header("Content-Type", "application/json")
                        .body(StringBody(
                                """{
                                "username":"#{username}",
                                "password":"#{password}",
                                "tenantPid":"#{connection}"
                                }"""
                        ))
                        .check(status().is(200))
                        .check(jsonPath("$.sifToken").saveAs("token"))
                )
                .exec(session -> {
                    // 把会话中的token存入map
                    map.put("authToken", session.getString("token"));
                    return session;
                })
);
修正后的完整代码示例

这里采用实例初始化块的方式修正你的代码,同时补上原代码中缺失的分号:

import lombok.extern.slf4j.Slf4j;

import java.util.*;
import java.util.stream.Stream;

import java.util.function.Supplier;
import java.net.*;

import static com.hmhco.assignments.performance.config.Constants.*;
import static io.gatling.javaapi.core.CoreDsl.*;
import static io.gatling.javaapi.http.HttpDsl.*;

import io.gatling.javaapi.core.*;
import io.gatling.javaapi.http.*;

@Slf4j
public class BaseSimulation extends Simulation {

    HttpProtocolBuilder httpProtocol = http
        .baseUrl(BASE_URL)
        .shareConnections();

    public String teachers = "data/teachers.csv";

    FeederBuilder<String> teacherFeeder = csv(teachers).random();

    // 顶部声明HashMap
    HashMap<String, String> map = new HashMap<>();

    // 实例初始化块填充值
    {
        map.put("authToken", "token");
    }

    ScenarioBuilder scn1 = scenario("auth-flow").repeat(AUTH_FLOW_REPEAT).on(
            feed(teacherFeeder)
                    .exec(http("Get Token from IDS")
                            .post(IDS_LOGIN_URL)
                            .header("Content-Type", "application/json")
                            .body(StringBody(
                                    """{
                                    "username":"#{username}",
                                    "password":"#{password}",
                                    "tenantPid":"#{connection}"
                                    }"""
                            ))
                            .check(status().is(200))
                            .check(jsonPath("$.sifToken").saveAs("token"))
                    )
    );

    SetUp testSetup = setUp(
            scn1.injectOpen(rampUsers(NUMBER_OF_USERS).during(RAMP_UP))
    ).maxDuration(MAX_DURATION);

}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 21:54:17