Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

A test class can have four setup and teardown methods that must fulfill these two conditions:

  • These methods must not return anything. In other words, their return type must be void.
  • Setup and teardown methods cannot be private.

The supported setup and teardown methods are described in the following:

  • The method that is annotated with the @BeforeAll annotation must be static, and it's run once before any test method is run.
  • The method that is annotated with the @BeforeEach is invoked before each test method.
  • The method that is annotated with the @AfterEach annotation is invoked after each test method.
  • The method that is annotated with the @AfterAll annotation must be static, and it's run once after all test methods have been run.


Let's add these methods to our test class. After we have added these setup and teardown methods to our test class, its source looks as follows:

...

After we have added setup and teardown methods to our test class, we can finally write our first test methods. Let's find out how we can do it.


Writing Our First Test Methods


A test method is a method that fulfills these three requirements:

  • A test method isn't private or static
  • A test method must not return anything. In other words, its return type must be void.
  • A test method must be annotated with the @Test annotation.


Let's add two test methods to our test class:

  1. The firstTest() method has a custom display name and it writes a unique string to System.out.
  2. The secondTest() method has a custom display name and it writes a unique string to System.out.

After we have written these two test methods, the source code of our test class looks as follows:


Code Block
import org.junit.jupiter.api.*;
 
@DisplayName("JUnit 5 Example")
class JUnit5ExampleTest {
 
    @BeforeAll
    static void beforeAll() {
        System.out.println("Before all test methods");
    }
 
    @BeforeEach
    void beforeEach() {
        System.out.println("Before each test method");
    }
 
    @AfterEach
    void afterEach() {
        System.out.println("After each test method");
    }
 
    @AfterAll
    static void afterAll() {
        System.out.println("After all test methods");
    }
 
// Added test methods

    @Test
    @DisplayName("First test")
    void firstTest() {
        System.out.println("First test method");
    }
 
    @Test
    @DisplayName("Second test")
    void secondTest() {
        System.out.println("Second test method");
    }
}


We have just written our first test methods. Let's see what happens when we run our unit tests.

Running tests

From shell

Note

Remember to install Maven & Java 8!


Go to your project directory 

Code Block
> cd TDD-java/Overview


and then run this:

Code Block
> mvn clean test

// clean deletes caches


You shoud see sth like this this:

Code Block
> mvn clean test  
              
[INFO] Scanning for projects...
[INFO] 
[INFO] --------------------< org.example:JUnit5_Overview >---------------------
[INFO] Building JUnit5_Overview 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ JUnit5_Overview ---
[INFO] Deleting /home/agatafilipczak/workspace/ACH/ach-tutorials/TDD-java/Overview/target
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ JUnit5_Overview ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO] 
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ JUnit5_Overview ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 1 source file to /home/agatafilipczak/workspace/ACH/ach-tutorials/TDD-java/Overview/target/classes
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ JUnit5_Overview ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /home/agatafilipczak/workspace/ACH/ach-tutorials/TDD-java/Overview/src/test/resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ JUnit5_Overview ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 2 source files to /home/agatafilipczak/workspace/ACH/ach-tutorials/TDD-java/Overview/target/test-classes
[INFO] 
[INFO] --- maven-surefire-plugin:3.0.0-M1:test (default-test) @ JUnit5_Overview ---
[INFO] 
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running JUnit5OverviewTest

// This is our output of tests

Before all test methods 

  Before each test method
    First test method
  After each test method 

  Before each test method
    Second test method
  After each test method 

After all test methods

// This is our results info about execution of tests

[INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.06 s - in JUnit5OverviewTest
[INFO] Running ExampleTest
example test method
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 s - in ExampleTest
[INFO] 
[INFO] Results:
[INFO] 
[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  4.034 s
[INFO] Finished at: 2021-10-20T20:01:11+02:00
[INFO] ------------------------------------------------------------------------


From Intellij IDE

Panel

After we have set up the code for the testing, we can run the tests and find out if the tested methods are working correctly.

  • To run all tests in a test class, click Icons run configurations test state runImage Added against the test class declaration and select Run.

Image Added

  • To run an individual test, click Icons run configurations test state runImage Added in the gutter and select Run.

Image Added


You can view test results in the Run tool window at the bottom of IDE.

Image Added


This output proves that the setup, teardown, and test methods are run in the correct order. Let's summarize what we learned from this blog post.

Summary

This tutorial has taught us four things:

  • A test class is a normal Java class that is either public or package private.
  • Setup and teardown methods must not be private and they must not return anything.
  • A test method is a method that isn't private and doesn't return anything.
  • We could specify the display name of a test class and a test method because this allows us to replace technical names with sentences that make sense.