Search code examples
scalatestinggatling

Gatling session - get attribute as Long


I am a new in Scala and got some problems with casting from String to Long. I try to get Gatling session value as Long in request. Before in exec() part, I try to set the userId value

def setUserId(): ChainBuilder = {
    exec(session => session
      .set("userId", Random.nextLong())
    )
  }

Next, in request creator I want to use it like that because I need a new userId every call:

object UserRequestCreator {

  def sampleUserRequest(currency: String): Request = {

    Data data = new Data()

    data.setUserId("${userId}".toLong)
    data.setCurrency(currency)
  }
}

Test scenario:

exec(setUserId())
      .exec(http("postUser")
        .post(endpointUser).asXml
        .headers(headers)
        .body(StringBody(toXmlString(sampleUserRequest("EUR"), classOf[Request])))
        .check(status.is(200))

but receive error:

java.lang.NumberFormatException: For input string: "${userId}"

How to fix that in Scala? I also try Long.valueOf, JLong.parseLong("${userId"}, 16), Try(BigDecimal(...)) and more but nothing can help. I think the problem is with $ symbol, but I don't see any different way to get this value from the session. Maybe it is possible to store Long in the Gating session?


Solution

  • From the documentation and based on your current code, one way to do it is like that:

    // with a function payload
    http("name").post("/")
      .body(StringBody(session => s"""{ "foo": "${session("dynamicValueKey").as[String]}" }"""))
    

    Thus, in your case:

    StringBody(session => toXmlString(sampleUserRequest(session)("EUR"), classOf[Request])
    
    def sampleUserRequest(session: Session)(currency: String): Request = {
      //...
      data.setUserId(session("userId").as[Long])
    }