rogervinas / tests-everywhere
🤠 Tests, Tests Everywhere!
Scala testing this simple Hello World with ScalaTest and Mockito
Show me the code
Implementation
- 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()
Test
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
Happy Testing! 💙
Top comments (0)