ScalaTest

ScalaTest supports three main styles of testing out of the box: test-driven development (TDD), behavior-driven development (BDD), and acceptance testing. ScalaTest also supports writing JUnit and TestNG tests in Scala.

Scalatra has an integration to make the use of ScalaTest more convenient.

Convenience traits are provided for many Suite implementations:

  • ScalatraSpec
  • ScalatraFlatSpec
  • ScalatraFreeSpec
  • ScalatraWordSpec
  • ScalatraFunSuite
  • ScalatraFeatureSpec
  • ScalatraJUnit3Suite
  • ScalatraJUnitSuite (JUnit 4)
  • ScalatraTestNGSuite

Notice that all the above traits are based on ScalatraSuite which mixes in BeforeAndAfterAll. It overrides both beforeAll() and afterAll() so it can start/stop the embedded HTTP server. Because of that, if your test classes also need to override beforeAll and/or afterAll just remember to call super.beforeAll() and/or super.afterAll().

Dependency

"org.scalatra" %% "scalatra-scalatest" % "2.3.1" % "test"

Example

Extend ScalatraSuite with your preferred org.scalatest.Suite implementation. You get ShouldMatchers and MustMatchers for free.

import org.scalatra.test.scalatest._
import org.scalatest.FunSuiteLike

class HelloWorldServletTests extends ScalatraSuite with FunSuiteLike {
  // `HelloWorldServlet` is your app which extends ScalatraServlet
  addServlet(classOf[HelloWorldServlet], "/*")

  test("simple get") {
    get("/path/to/something") {
      status should equal (200)
      body should include ("hi!")
    }

    get("/path/to/something", ("param1" -> "value"), ("param2" -> "value2")) {
      status should equal (200)
      body should include ("hi!")
    }

    get("/path/to/something",
        Map("param1" -> "value", "param2" -> "value2"),
        Map("Header1" -> "header_value", "Header2" -> "header_value2")) {
      status should equal (200)
      body should include ("hi!")
    }
  }
}

You can see all the available http different methods in the API docs

The addServlet method is used here with classOf[HelloWorldServlet] to mount the HelloWorld servlet into the ScalaTest test.

If you’ve got a servlet which takes constructor params, you’ll need to mount the servlet in your test with a different addServlet method overload, e.g.:

  implicit val myImplicitHere = new ImplicitConstructorParam
  addServlet(new HelloWorldServlet, "/*")