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
相关产品推荐
相关产品推荐

