The @Before
annotation can be used to accompany the @Test
methods. Methods tagged with @Before
will run before each test method and look like the following:
@Before public void beforeEachTest() { // Something multiple tests use }
They’re typically used if multiple test methods share a similarly created object or set of variables. Placing those inside the @Before
annotated method ensures those objects are always freshly created and have the same starting attributes upon instantiation. This allows each test to work with those objects and variables without needing to create them themselves inside their own test bodies.
If we look at the example we covered in the previous exercise, we created the Human
named “Sam” twice in the exact same fashion. Now that we know about the @Before
annotation, we could instead place the creation of sam
inside of the @Before
method:
Human sam; @Before public void createSam() { sam = new Human(“Sam”, 100); } @Test public void testHuman() { assertEquals(100, sam.getHitpoints()); assertEquals(“Sam”, sam.getName()); } @Test public void testHumanTakeDamage() { assertEquals(100, sam.getHitpoints()); sam.takeDamage(10); assertEquals(90, sam.getHitpoints()); }
This is different from just making sam
a class variable, which is also visible by all tests because the @Before
will re-run before each test. This means if tests modify the sam
variable in any way, it ensures sam
gets reset before the next test runs.
There’s another variant of the @Before
annotation that will let us create a method that will run one time before all tests instead of multiple times before each test. This is done by using the @BeforeClass
annotation.
@Before
and @BeforeClass
both have their unique uses, making them valuable tools for JUnit testing.
Instructions
TestExample.java has multiple test methods that all interact and alter the same integer variable within the test class.
Note: This simple test class has no associated java class.
To compile and run your code, enter the following into the terminal:
$ ./run.bat
Run the test class and Check Work. Notice how some tests fail despite being written properly. Ask yourself why this might be the case.
Write an @Before
method at the top of the test class and call it beforeEachTest()
. Leave int a;
in the global scope of the class, but set its value to 10
inside of the @Before
method.
Note: Don’t forget the import for the @Before
annotation!
To compile and run your code, enter the following into the terminal:
$ ./run.bat
Run the test class again, then Check Work, and watch all the tests pass as expected.