How do I test null and non-null values in JUnit?

To test null and non-null values in JUnit, use these assertions:

  • assertNull(value) — passes if the value is null
  • assertNotNull(value) — passes if the value is not null

In JUnit 5, these methods are available from org.junit.jupiter.api.Assertions.

Basic Example

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertNotNull;

class NullCheckTest {

    @Test
    void valueShouldBeNull() {
        String name = null;

        assertNull(name);
    }

    @Test
    void valueShouldNotBeNull() {
        String name = "John";

        assertNotNull(name);
    }
}

Using Assertion Messages

You can add a message to make test failures easier to understand.

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertNotNull;

class NullCheckTest {

    @Test
    void valueShouldBeNull() {
        String result = null;

        assertNull(result, "The result should be null");
    }

    @Test
    void valueShouldNotBeNull() {
        String result = "Hello JUnit";

        assertNotNull(result, "The result should not be null");
    }
}

Testing a Method That May Return Null

Suppose you have a method that returns a username:

class UserService {

    String findUsernameById(int id) {
        if (id == 1) {
            return "Alice";
        }
        return null;
    }
}

You can test both cases like this:

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertEquals;

class UserServiceTest {

    private final UserService userService = new UserService();

    @Test
    void findUsernameByIdReturnsNameWhenUserExists() {
        String username = userService.findUsernameById(1);

        assertNotNull(username);
        assertEquals("Alice", username);
    }

    @Test
    void findUsernameByIdReturnsNullWhenUserDoesNotExist() {
        String username = userService.findUsernameById(99);

        assertNull(username);
    }
}

Testing Null Arguments

If your code should reject null values, use assertThrows() to check that an exception is thrown.

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;

class PersonTest {

    @Test
    void constructorThrowsExceptionWhenNameIsNull() {
        NullPointerException exception = assertThrows(
                NullPointerException.class,
                () -> new Person(null)
        );

        assertEquals("Name cannot be null", exception.getMessage());
    }
}

class Person {

    private final String name;

    Person(String name) {
        if (name == null) {
            throw new NullPointerException("Name cannot be null");
        }

        this.name = name;
    }
}

Summary

Use:

assertNull(value);
assertNotNull(value);

For null-related exceptions, use:

assertThrows(NullPointerException.class, () -> {
    // code that should throw NullPointerException
});

These assertions are the standard way to test null and non-null values in JUnit 5.

How do I test boolean conditions with assertTrue() and assertFalse()?

Use assertTrue() when you expect a boolean condition to be true, and assertFalse() when you expect it to be false.

They are JUnit assertions, most commonly used in JUnit 5 like this:

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

class BooleanConditionTest {

    @Test
    void shouldCheckBooleanConditions() {
        String message = "Hello JUnit";

        assertTrue(message.contains("JUnit"));
        assertFalse(message.isEmpty());
    }
}

assertTrue()

assertTrue(condition) passes if the condition evaluates to true.

assertTrue(5 > 3);
assertTrue("JUnit".startsWith("J"));

If the condition is false, the test fails.

assertFalse()

assertFalse(condition) passes if the condition evaluates to false.

assertFalse(5 < 3);
assertFalse("JUnit".isBlank());

If the condition is true, the test fails.

Example with a custom method

Suppose you have a method that checks whether a user is active:

class User {
    private boolean active;

    User(boolean active) {
        this.active = active;
    }

    boolean isActive() {
        return active;
    }
}

You can test it like this:

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

class UserTest {

    @Test
    void activeUserShouldReturnTrue() {
        User user = new User(true);

        assertTrue(user.isActive());
    }

    @Test
    void inactiveUserShouldReturnFalse() {
        User user = new User(false);

        assertFalse(user.isActive());
    }
}

Add failure messages

You can also provide a message that appears when the assertion fails:

assertTrue(user.isActive(), "User should be active");
assertFalse(message.isEmpty(), "Message should not be empty");

Summary

Assertion Use when you expect
assertTrue(condition) The condition should be true
assertFalse(condition) The condition should be false

In short:

assertTrue(value > 0);
assertFalse(name.isBlank());

How do I test expected values with assertEquals()?

In JUnit, you use assertEquals() to test whether an actual value matches an expected value.

The basic syntax is:

assertEquals(expectedValue, actualValue);

The first argument is what you expect.
The second argument is what your code actually produced.

Basic Example

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

class CalculatorTest {

    @Test
    void shouldAddTwoNumbers() {
        int result = 2 + 3;

        assertEquals(5, result);
    }
}

In this example:

assertEquals(5, result);

means:

I expect the result to be 5.

If result is 5, the test passes.
If result is anything else, the test fails.

Example with Strings

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

class GreetingTest {

    @Test
    void shouldReturnGreetingMessage() {
        String message = "Hello, Java";

        assertEquals("Hello, Java", message);
    }
}

Using a Failure Message

You can add a custom message that appears when the test fails:

assertEquals(10, result, "The result should be 10");

Example:

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

class MathTest {

    @Test
    void shouldMultiplyNumbers() {
        int result = 4 * 3;

        assertEquals(12, result, "4 multiplied by 3 should be 12");
    }
}

Common Mistake

Be careful with the order:

assertEquals(expected, actual);

Good:

assertEquals(100, total);

Less clear:

assertEquals(total, 100);

JUnit will still compare the values, but failure messages are easier to understand when the expected value comes first.

Example with a Method

Suppose you have this class:

class Calculator {

    int add(int a, int b) {
        return a + b;
    }
}

You can test it like this:

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

class CalculatorTest {

    @Test
    void addShouldReturnSum() {
        Calculator calculator = new Calculator();

        int actual = calculator.add(2, 3);

        assertEquals(5, actual);
    }
}

Summary

Use assertEquals() like this:

assertEquals(expected, actual);

For example:

assertEquals(5, result);
assertEquals("Alice", name);
assertEquals(100.0, price);

assertEquals() is one of the most common JUnit assertions because it clearly checks whether your code returned the value you expected.

How do I use assertions in JUnit?

In JUnit, assertions are used to verify that your code produces the expected result. If an assertion fails, the test fails.

JUnit 5 assertions are provided by the org.junit.jupiter.api.Assertions class.

Basic Example

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

class CalculatorTest {

    @Test
    void testAddition() {
        int result = 2 + 3;

        assertEquals(5, result);
    }
}

In this example, the test passes because 2 + 3 equals 5.

Common JUnit Assertions

assertEquals()

Use assertEquals() to check whether two values are equal.

import static org.junit.jupiter.api.Assertions.assertEquals;

assertEquals(10, 5 + 5);
assertEquals("Hello", "He" + "llo");

You can also provide a failure message:

assertEquals(10, 5 + 4, "The result should be 10");

assertNotEquals()

Use assertNotEquals() to check that two values are not equal.

import static org.junit.jupiter.api.Assertions.assertNotEquals;

assertNotEquals(10, 5 + 4);

assertTrue() and assertFalse()

Use assertTrue() when a condition should be true.

import static org.junit.jupiter.api.Assertions.assertTrue;

assertTrue(10 > 5);

Use assertFalse() when a condition should be false.

import static org.junit.jupiter.api.Assertions.assertFalse;

assertFalse(10 < 5);

assertNull() and assertNotNull()

Use assertNull() to check that a value is null.

import static org.junit.jupiter.api.Assertions.assertNull;

String name = null;

assertNull(name);

Use assertNotNull() to check that a value is not null.

import static org.junit.jupiter.api.Assertions.assertNotNull;

String name = "Kode Java";

assertNotNull(name);

assertSame() and assertNotSame()

Use assertSame() to check whether two references point to the same object.

import static org.junit.jupiter.api.Assertions.assertSame;

String text = "Java";
String sameText = text;

assertSame(text, sameText);

Use assertNotSame() when two references should not point to the same object.

import static org.junit.jupiter.api.Assertions.assertNotSame;

String first = new String("Java");
String second = new String("Java");

assertNotSame(first, second);

Note that assertEquals() checks object equality, while assertSame() checks object identity.

assertArrayEquals()

Use assertArrayEquals() to compare arrays.

import static org.junit.jupiter.api.Assertions.assertArrayEquals;

int[] expected = {1, 2, 3};
int[] actual = {1, 2, 3};

assertArrayEquals(expected, actual);

assertThrows()

Use assertThrows() to verify that a block of code throws an expected exception.

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertThrows;

class NumberParserTest {

    @Test
    void testInvalidNumber() {
        assertThrows(NumberFormatException.class, () -> {
            Integer.parseInt("abc");
        });
    }
}

You can also inspect the thrown exception:

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;

NumberFormatException exception = assertThrows(
        NumberFormatException.class,
        () -> Integer.parseInt("abc")
);

assertEquals("For input string: \"abc\"", exception.getMessage());

assertAll()

Use assertAll() to group multiple assertions together. JUnit will run all assertions and report all failures.

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;

class UserTest {

    @Test
    void testUserDetails() {
        String name = "Alice";
        int age = 25;

        assertAll(
                () -> assertEquals("Alice", name),
                () -> assertEquals(25, age),
                () -> assertTrue(age >= 18)
        );
    }
}

Without assertAll(), the test stops at the first failed assertion.

fail()

Use fail() when a test should fail explicitly.

import static org.junit.jupiter.api.Assertions.fail;

fail("This test should not reach this point");

This is often useful inside conditional logic or exception handling.

Complete Example

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

class StringUtilsTest {

    @Test
    void testStringAssertions() {
        String text = "JUnit";

        assertEquals("JUnit", text);
        assertNotEquals("TestNG", text);
        assertTrue(text.startsWith("J"));
        assertFalse(text.isEmpty());
        assertNotNull(text);
    }

    @Test
    void testArrayAssertions() {
        int[] numbers = {1, 2, 3};

        assertArrayEquals(new int[]{1, 2, 3}, numbers);
    }

    @Test
    void testExceptionAssertion() {
        assertThrows(NumberFormatException.class, () -> {
            Integer.parseInt("not-a-number");
        });
    }
}

Using Static Imports

Most JUnit tests use static imports so assertions can be written directly:

import static org.junit.jupiter.api.Assertions.*;

Then you can write:

assertEquals(5, result);
assertTrue(result > 0);
assertThrows(Exception.class, () -> someMethod());

Instead of:

Assertions.assertEquals(5, result);
Assertions.assertTrue(result > 0);
Assertions.assertThrows(Exception.class, () -> someMethod());

Summary

Common JUnit assertion methods include:

Assertion Purpose
assertEquals(expected, actual) Checks that two values are equal
assertNotEquals(unexpected, actual) Checks that two values are not equal
assertTrue(condition) Checks that a condition is true
assertFalse(condition) Checks that a condition is false
assertNull(value) Checks that a value is null
assertNotNull(value) Checks that a value is not null
assertSame(expected, actual) Checks that two references point to the same object
assertNotSame(unexpected, actual) Checks that two references do not point to the same object
assertArrayEquals(expected, actual) Checks that two arrays are equal
assertThrows(type, executable) Checks that an exception is thrown
assertAll(executables) Groups multiple assertions
fail(message) Fails the test explicitly

In short, assertions are the main way to express what your code is expected to do in a JUnit test.

How do I use @Test in JUnit?

Using @Test in JUnit

In JUnit, @Test is an annotation that marks a method as a test method. When you run your tests, JUnit looks for methods annotated with @Test and executes them automatically.


1. Add the Correct Import

For JUnit 5, use:

import org.junit.jupiter.api.Test;

You will usually also import assertions such as:

import static org.junit.jupiter.api.Assertions.*;

2. Basic Example

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

class CalculatorTest {

    @Test
    void addTwoNumbers() {
        int result = 10 + 15;

        assertEquals(25, result);
    }
}

Here:

  • @Test tells JUnit this method should be run as a test.
  • assertEquals(25, result) checks that the actual result is 25.
  • If the assertion passes, the test passes.
  • If the assertion fails, the test fails.

3. Common JUnit 5 Assertions

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

class ExampleTest {

    @Test
    void assertionsExample() {
        String message = "Hello JUnit";

        assertNotNull(message);
        assertTrue(message.contains("JUnit"));
        assertEquals("Hello JUnit", message);
    }
}

Common assertions include:

Assertion Purpose
assertEquals(expected, actual) Checks that two values are equal
assertTrue(condition) Checks that a condition is true
assertFalse(condition) Checks that a condition is false
assertNotNull(value) Checks that a value is not null
assertThrows(...) Checks that code throws an expected exception

4. Testing Exceptions

Use assertThrows() when you expect code to throw an exception:

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertThrows;

class DivisionTest {

    @Test
    void divideByZeroThrowsException() {
        assertThrows(ArithmeticException.class, () -> {
            int result = 10 / 0;
        });
    }
}

5. JUnit 5 Test Method Rules

In JUnit 5, test methods usually:

  • Are annotated with @Test
  • Return void
  • Do not need to be public
  • Should contain assertions
  • Should have descriptive names

Example:

@Test
void shouldReturnSumWhenAddingTwoNumbers() {
    assertEquals(5, 2 + 3);
}

6. JUnit 4 vs. JUnit 5 Import

Be careful: JUnit 4 and JUnit 5 use different @Test imports.

JUnit 5

import org.junit.jupiter.api.Test;

JUnit 4

import org.junit.Test;

For new projects, JUnit 5 is generally recommended.


7. Running the Test

You can run JUnit tests from:

  • Your IDE, such as IntelliJ IDEA or Eclipse
  • Maven
  • Gradle

With Maven:

mvn test

With Gradle:

gradle test

or:

./gradlew test

Summary

Use @Test above a method to tell JUnit, “this is a test.”

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

class MyTest {

    @Test
    void simpleTest() {
        assertEquals(4, 2 + 2);
    }
}

That method will be discovered and run by JUnit as part of your test suite.