Search code examples
scalagatling

Is it possible to extend a method within an extended scala class?


Assume I have the following scala classes, is it possible to extend a function on SecondClass and add more code to it? (possibly chained to another function within the function i'd like to extend)

package io.gatling.http.check
class FirstClass {

  def login() = {
    exec(http("Login")
      .post("anonymous/login")
      .body(ElFileBody("rest/UserAnonymousLogin.json")).asJson
}
}

I would like to extend the login function with the following (.check(status is 200)

class SecondClass extends FirstClass {

  def login() = {
     .check(status is 200))
}
}

Is that possible?


Solution

  • Given checks method accepts a variable number of HttpCheck, that is, HttpCheck*

    def check(checks: HttpCheck*): HttpRequestBuilder
    

    consider refactoring FirstClass to

      class FirstClass {
        def login(checks: HttpCheck*) = {
          exec(http("Login")
            .post("anonymous/login")
            .body(ElFileBody("rest/UserAnonymousLogin.json")).asJson
            .check(checks: _*)
          )
        }
      }
    

    Note how by default we pass no checks when calling (new FirstClass).login().

    Now derived classes could pass in a checks to be performed like so

      class SecondClass extends FirstClass {
        def loginWithStatusCheck() = {
          super.login(status is 200)
        }
      }
    

    Note we are not actually overriding FirstClass.login here.

    Another approach instead of overriding could be functional composition, for example, we break down the problem into smaller functions

      val buildClient: String => Http = http(_)
      val buildPostRequest: Http => HttpRequestBuilder = _.post("anonymous/login").body(ElFileBody("rest/UserAnonymousLogin.json")).asJson
      val checkStatus: HttpRequestBuilder => HttpRequestBuilder = _.check(status is 200)
    

    and then compose them

    exec((buildClient andThen buildPostRequest andThen checkStatus)("Login"))
    

    Now we can simply add further steps to the composition instead of worrying about class hierarchies and overriding.