Scala testing with ScalaTest and Mockito
- Create
HelloMessage
class in HelloMessage.scala:
class HelloMessage:
def text: String = "Hello World!"
We can create it as a class as Mockito is able to mock final classes.
- Same way create
HelloConsole
class in HelloConsole.scala:
class HelloConsole:
def print(text: String): Unit =
println(text)
- Create
HelloApp
class in HelloApp.scala:
class HelloApp(message: HelloMessage, console: HelloConsole):
def printHello(): Unit =
console.print(message.text)
- Create main class in Main.scala that wraps it all together:
@main def main(): Unit =
val message = HelloMessage()
val console = HelloConsole()
val app = HelloApp(message, console)
app.printHello()
Following ScalaTest > Writing your first test and ScalaTest + Mockito guides ...
- Test
HelloMessage
in HelloMessageSpec.scala:
class HelloMessageSpec extends AnyFlatSpec {
"A HelloMessage" should "return hello world" in {
val message = HelloMessage()
assertResult(message.text) {
"Hello World!"
}
}
}
- Test
HelloApp
in HelloAppSpec.scala:
class HelloAppSpec extends AnyFlatSpec {
"A HelloApp" should "print hello message" in {
val messageText = "Hello Test!"
// 2.1 Create a mock of HelloMessage
val message = mock[HelloMessage]
// 2.2 Return "Hello Test!" whenever text is called
when(message.text).thenReturn(messageText)
// 2.3 Create a mock of HelloConsole
val console = mock[HelloConsole]
// 2.4 Create a HelloApp, the one we want to test, passing the mocks
val app = HelloApp(message, console)
// 2.5 Execute the method we want to test
app.printHello()
// 2.6 Verify HelloConsole mock print() method
// has been called once with "Hello Test!"
verify(console).print(messageText)
}
}
- Test output should look like:
[info] HelloMessageSpec:
[info] A HelloMessage
[info] - should return hello world
[info] HelloAppSpec:
[info] A HelloApp
[info] - should print hello message
[info] Run completed in 515 milliseconds.
[info] Total number of tests run: 2
[info] Suites: completed 2, aborted 0
[info] Tests: succeeded 2, failed 0, canceled 0, ignored 0, pending 0
[info] All tests passed.
[success] Total time: 6 s
Run this project using 🐳 docker
- Execute
./docker-run.sh
- Once inside the container:
- Test with
sbt test
- Run with
sbt run
- Test with
- Install Java manually or ...
- Install SdkMan and ...
- List available versions executing
sdk list java
- List available versions executing
- Install SdkMan and ...
- Install Scala
- Install Coursier and execute
cs install scala:3.3.1
- Install Coursier and execute
- Test with
sbt test
- Run with
sbt run
- Create project using
sbt new scala/scala3.g8
(⚠️ maybe you get an error with Java 21 and you'll need Java 17 just for this step) - Add ScalaTest and Mockito dependencies in build.sbt:
libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.17" % Test,
libraryDependencies += "org.scalatestplus" %% "mockito-4-11" % "3.2.17.0" % Test
💡 Alternatively you can create a project using Gradle Scala Application Sample