In this tutorial we will dive into JUnit5 framework even more basing on very simple Calculator project.


The tutorial repository can be found here:

https://gitlab.eufus.psnc.pl/ach/ach-tutorials

Project Structure:

.
├── pom.xml
└── src
    ├── main
    │   └── java
    │       └── Calculator.java
    └── test
        └── java
            └── CalculatorTest.java

Our Calculator.java  look like this:

As you can see it has only divide() method, that checks if b is equal to 0. If it is, it throws an exception.

public class Calculator {

    static Double divide(Double a, Double b) {
        if (b != 0) {
            return a / b;
        }
        else{
            throw new ArithmeticException("Division by 0 is impossible!");
        }
    }

    public static void main(String[] args) {
        System.out.printf(Calculator.divide(8.0,2.0).toString());
    }

}

So let's write first simple test, but before that we need to know what the assertion are.

1. Assertions 

Assertion is a statement in java. It can be used to test your assumptions about the program.

JUnit 5 assertions help in validating the expected output with actual output of a testcase. (The order is always the same!!)

List of every possible assertions is here: https://junit.org/junit5/docs/5.7.2/api/org.junit.jupiter.api/org/junit/jupiter/api/Assertions.html

So our test class looks like this:

 @Test
    @DisplayName("Divide two finite numbers")
    void divideTest() {
	     
         final double EXPECTED = 4;
         final double ACTUAL = Calculator.divide(8.0,2.0);

        assertEquals(EXPECTED,ACTUAL);
    }

2. Exceptions

To ensure our error handling works correctly, we can verify that a piece of code throws a specific exception under certain conditions.

This can be done with the assertThrows() method in JUnit 5: If we catch this thrown exception test is passed.


    @Test
    @DisplayName("Divide by 0")
    void divideBy0ExpectedExceptionTest() {
        assertThrows(ArithmeticException.class, () -> {
            Calculator.divide(8.0,0.0);
        });





  • No labels