JUnit 4 and JUnit 5 are versions of a tool that helps test Java code. Knowing their differences helps you write better tests and use the right features.
JUnit 4 vs JUnit 5 (Jupiter) differences
JUnit 4 example: import org.junit.Test; import static org.junit.Assert.*; public class ExampleTest { @Test public void testAddition() { assertEquals(5, 2 + 3); } } JUnit 5 example: import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; public class ExampleTest { @Test void testAddition() { assertEquals(5, 2 + 3); } }
JUnit 5 uses the package org.junit.jupiter.api instead of org.junit.
JUnit 5 test methods can have default (package-private) visibility, no need to be public.
@Test.@Test
public void testMethod() {
assertTrue(true);
}@Test from Jupiter.@Test
void testMethod() {
assertTrue(true);
}@Before for setup before each test.@Before
public void setup() {
// runs before each test in JUnit 4
}@BeforeEach instead of @Before.@BeforeEach
void setup() {
// runs before each test in JUnit 5
}This JUnit 5 test class has two simple tests for addition and subtraction. Each test checks if the math result is correct.
import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; public class CalculatorTest { @Test void additionTest() { int result = 2 + 3; assertEquals(5, result, "2 + 3 should equal 5"); } @Test void subtractionTest() { int result = 5 - 3; assertEquals(2, result, "5 - 3 should equal 2"); } }
JUnit 5 is modular and supports running JUnit 4 tests via a vintage engine.
JUnit 5 supports lambda expressions for assertions, making tests cleaner.
JUnit 5 has better support for tagging and filtering tests.
JUnit 5 is the newer, more flexible version of JUnit with better Java support.
JUnit 4 requires public test methods; JUnit 5 does not.
Annotations like @Before in JUnit 4 are replaced by @BeforeEach in JUnit 5.
Practice
Solution
Step 1: Understand JUnit 4 test method visibility
JUnit 4 requires test methods to be declared as public for the framework to recognize and run them.Step 2: Understand JUnit 5 test method visibility
JUnit 5 allows test methods to have any visibility, including package-private, making it more flexible.Final Answer:
JUnit 4 requires test methods to be public, but JUnit 5 does not. -> Option AQuick Check:
JUnit 4 public test methods = true [OK]
- Thinking JUnit 5 also requires public test methods
- Assuming both versions have the same visibility rules
- Confusing private and public requirements
@Before from JUnit 4 in JUnit 5?Solution
Step 1: Identify JUnit 4 setup annotation
JUnit 4 uses@Beforeto run code before each test method.Step 2: Identify JUnit 5 equivalent annotation
JUnit 5 replaces@Beforewith@BeforeEachto clarify it runs before each test method.Final Answer:
@BeforeEach -> Option DQuick Check:
@Before in JUnit 4 = @BeforeEach in JUnit 5 [OK]
- Choosing @BeforeAll which runs once before all tests
- Using non-existent annotations like @Setup or @Init
- Confusing @BeforeEach with @AfterEach
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
class CalculatorTest {
@Test
void addTest() {
int result = 2 + 3;
assertEquals(5, result);
}
}What will be the test result when running this test?
Solution
Step 1: Check method visibility in JUnit 5
The test method is package-private (no modifier), which is allowed in JUnit 5.Step 2: Verify assertion correctness
The assertion compares 5 and result (2+3=5), so it matches and passes.Final Answer:
Test passes successfully -> Option AQuick Check:
2 + 3 = 5, assertion true [OK]
- Assuming test methods must be public in JUnit 5
- Thinking missing @BeforeEach causes failure here
- Confusing assertion order causing failure
import org.junit.Before;
import org.junit.Test;
public class SampleTest {
@Before
public void setup() {
System.out.println("Setup");
}
@Test
void testMethod() {
System.out.println("Test");
}
}What is the main issue when running this test?
Solution
Step 1: Check test method visibility requirement in JUnit 4
JUnit 4 requires test methods to be public, but here testMethod() has default (package-private) visibility.Step 2: Verify @Before method correctness
The setup() method is public and correctly annotated, so no issue there.Final Answer:
The test method must be public in JUnit 4 -> Option BQuick Check:
JUnit 4 test methods must be public [OK]
- Thinking @Before is invalid in JUnit 4
- Assuming setup must be static
- Believing test runs despite non-public test method
Solution
Step 1: Identify visibility requirements in JUnit 5
JUnit 5 does not require test methods to be public; package-private is allowed.Step 2: Check other migration steps
Replacing@Beforewith@BeforeEachand updating imports to Jupiter packages are required for migration.Final Answer:
Make all test methods public -> Option CQuick Check:
JUnit 5 relaxes method visibility rules [OK]
- Thinking test methods must be public in JUnit 5
- Forgetting to update import statements
- Missing @Before to @BeforeEach replacement
Ready to prove it?
Pass the test and this pattern moves unknown
