How to use JUnit with Scala
Problem: You want to test your Scala code using JUnit.
Solution
Include the JUnit library in your project, and use it in the same way you’ve used it in Java projects, with a few minor changes.
Assuming you’re using SBT on your project, include JUnit into the project by adding this dependency line to your build.sbt file:
libraryDependencies +
=
"com.novocode"
%
"junit-interface"
%
"0.8"
%
"test->default"
|
According to the SBT testing documentation, “support for JUnit is provided by junit-interface,” so you add it as a dependency here.
Next, if you’re also using Eclipse, generate your Eclipse project files:
$ sbt eclipse
Then start Eclipse and import your project as usual.
In your project, create these simple model classes in a file named Pizza.scala under the src/main/scala directory:
package
com.acme.pizza
import
scala.collection.mutable.ArrayBuffer
case
class
Topping(name
:
String)
class
Pizza {
private
var
toppings
=
new
ArrayBuffer[Topping]
def
addTopping (t
:
Topping) { toppings +
=
t}
def
removeTopping (t
:
Topping) { toppings -
=
t}
def
getToppings
=
toppings.toList
}
|
(Any directory under src/main/scala is fine. Unlike Java, Scala package names don’t have to match the directory structure.)
Next, create a JUnit test class as usual. Put the following code in a file named PizzaTests.scala under the src/test/scala directory:
package
com.acme.pizza
import
org.junit.Test
import
junit.framework.TestCase
import
org.junit.Assert.
_
class
PizzaTests
extends
TestCase {
var
pizza
:
Pizza
=
_
override
def
setUp {
pizza
=
new
Pizza
}
def
testOneTopping {
pizza.addTopping(Topping(
"green olives"
))
assertEquals(pizza.getToppings.size,
1
)
}
def
testAddingAndRemovingToppings {
pizza.addTopping(Topping(
"green olives"
))
pizza.removeTopping(Topping(
"green olives"
))
assertEquals(pizza.getToppings.size,
0
)
}
}
|
If you’re using Eclipse, run the tests from the Eclipse menu system. Choose Run > Run As… > JUnit Test, and you should see your tests run successfully.
To run the tests using SBT, run the
sbt test
command from your operating system’s command line, in the root directory of your SBT project:
$ sbt test
The output shows that the tests passed:
[info] Passed: : Total 2, Failed 0, Errors 0, Passed 2, Skipped 0 [success] Total time: 1 s
Discussion
Beyond running a single, simple JUnit test class, you can also create additional test classes, and then a
TestSuite
. To demonstrate this, first create a new test class named ToppingTests.scala in the src/test/scala directory:
package
com.acme.pizza
import
org.junit.Test
import
junit.framework.TestCase
import
org.junit.Assert.
_
class
ToppingTests {
@
Test
def
foo {
val
t
1
=
Topping(
"cheese"
)
val
t
2
=
Topping(
"cheese"
)
assertEquals(t
1
, t
2
)
}
}
|
Then create a
TestSuite
class named
PizzaTestSuite
and save it in a file named PizzaTestSuite.scala in the src/test/scala directory:
package
com.acme.pizza
import
org.junit.runner.RunWith
import
org.junit.runners.Suite
@
RunWith(classOf[Suite])
@
Suite.SuiteClasses(Array(classOf[PizzaTests], classOf[ToppingTests]))
class
PizzaTestSuite
|
If you’re using Eclipse, with this class in the editor, choose Run > Run As > JUnit Test, and you should see both your
PizzaTests
and
ToppingTests
run successfully.
If you’re using SBT, just run
sbt test
again.
As you’ve seen in these examples, it’s simple to use Scala with JUnit. The following lines show the major differences between using Scala instead of Java:
@
RunWith(classOf[Suite])
@
Suite.SuiteClasses(Array(classOf[PizzaTests], classOf[ToppingTests]))
|
In the first line,
classOf[Suite]
is used because Scala uses this syntax instead
of Suite.class, which is the syntax Java uses. You do the same thing in the second line, and also replace the Java curly brackets array syntax with an
Array
declaration. Everything else is a straightforward
port from Java to Scala.
JUnit has some advantages compared to ScalaTest or specs2. One advantage is that test execution is generally faster with JUnit. Also, you can use JUnit if you want to, and import the ScalaTest or the specs2 matchers inside your test cases if you want more expressivity for your assertions.
That being said, if you’re going to code in Scala, I recommend using ScalaTest or specs2 for testing. As a friend likes to say, when we moved from C to Java, we didn’t attempt to bring make along with us; we switched to Ant or Maven, so I’m a firm believer in using native Scala tools like SBT, ScalaTest, and specs2.
See Also
- The SBT “testing” documentation: http://www.scala-sbt.org/release/docs/Detailed-Topics/Testing
related
- ScalaTest 105 - Adding more tests and a test suite
- ScalaTest 102 - Writing TDD style unit tests with ScalaTest
- ScalaTest 112 - How to run ScalaTest unit tests in Eclipse
- ScalaTest 104 - Adding Given/When/Then behavior to ScalaTest BDD tests
- ScalaTest 103 - Writing a first BDD test with ScalaTest
- ScalaTest 109 - Mark your tests with tags to include or exclude them
new
- How to drop the first matching element in a Scala sequence
- How to sum the elements of a List in Java
- What does ‘???’ (three question marks) mean in Scala?
- Scala best practice: How to use the Option/Some/None pattern
- Scala best practice: Eliminate null values from your code
- Scala best practice: Use match expressions and pattern matching
- Scala best practice: Think “Expression-Oriented Programming”
- Scala programming best practice: Prefer immutable variables (values)
- Scala best practice: Create methods that have no side effects (pure functions)
- Scala best practices (idioms) (from the Scala Cookbook)
Post new comment
http://alvinalexander.com/scala/how-to-use-junit-testing-with-scala“>
0 comments:
Post a Comment