Top Related Projects
Most popular Mocking framework for unit tests written in Java
TestNG testing framework
Java (and original) version of Hamcrest
AssertJ is a library providing easy to use rich typed assertions
The Enterprise-ready testing and specification framework.
Quick Overview
JUnit is a popular unit testing framework for Java programming. It provides annotations to identify test methods, assertions for verifying expected results, and test runners for executing tests. JUnit is widely used in Java development for creating and running automated tests to ensure code quality and reliability.
Pros
- Simple and intuitive API for writing and organizing tests
- Extensive integration with IDEs and build tools
- Supports parameterized tests and test suites
- Active community and regular updates
Cons
- Limited built-in support for mocking (requires additional libraries)
- Can be verbose for certain types of tests
- Learning curve for advanced features and best practices
- Performance overhead for large test suites
Code Examples
- Basic test example:
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class CalculatorTest {
@Test
void testAddition() {
Calculator calc = new Calculator();
assertEquals(5, calc.add(2, 3), "2 + 3 should equal 5");
}
}
- Parameterized test example:
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import static org.junit.jupiter.api.Assertions.*;
public class StringUtilsTest {
@ParameterizedTest
@CsvSource({"test,TEST", "TeSt,TEST", "Java,JAVA"})
void toUpperCase_ShouldConvertToUpperCase(String input, String expected) {
assertEquals(expected, input.toUpperCase());
}
}
- Test lifecycle example:
import org.junit.jupiter.api.*;
public class LifecycleTest {
@BeforeAll
static void setUpAll() {
System.out.println("Before all tests");
}
@BeforeEach
void setUp() {
System.out.println("Before each test");
}
@Test
void test1() {
System.out.println("Test 1");
}
@Test
void test2() {
System.out.println("Test 2");
}
@AfterEach
void tearDown() {
System.out.println("After each test");
}
@AfterAll
static void tearDownAll() {
System.out.println("After all tests");
}
}
Getting Started
To use JUnit in your Java project:
- Add JUnit dependency to your project (e.g., using Maven):
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
- Create a test class and add test methods:
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class MyFirstTest {
@Test
void myFirstTestMethod() {
assertTrue(true);
}
}
- Run the tests using your IDE's test runner or build tool.
Competitor Comparisons
Most popular Mocking framework for unit tests written in Java
Pros of Mockito
- More flexible and expressive mocking capabilities
- Easier to read and write test code with less boilerplate
- Better support for modern Java features and frameworks
Cons of Mockito
- Steeper learning curve for beginners compared to JUnit
- May encourage overuse of mocking, leading to brittle tests
- Requires additional setup and configuration in some cases
Code Comparison
JUnit example:
@Test
public void testAddition() {
Calculator calc = new Calculator();
assertEquals(4, calc.add(2, 2));
}
Mockito example:
@Test
public void testServiceCall() {
DataService mockService = mock(DataService.class);
when(mockService.getData()).thenReturn("mocked data");
assertEquals("mocked data", mockService.getData());
}
Summary
While JUnit is primarily a testing framework, Mockito focuses on mocking and stubbing. Mockito provides more powerful mocking capabilities, making it easier to isolate units of code for testing. However, JUnit's simplicity can be advantageous for basic unit tests and for those new to testing. Both tools are often used together in Java projects, with JUnit providing the testing structure and Mockito enhancing the ability to create mock objects and define their behavior.
TestNG testing framework
Pros of TestNG
- More flexible test configuration with XML files and annotations
- Built-in support for parameterized and data-driven testing
- Better support for parallel execution and test dependencies
Cons of TestNG
- Steeper learning curve due to more complex configuration options
- Less widespread adoption compared to JUnit in the Java ecosystem
- Requires additional setup and dependencies in some build systems
Code Comparison
TestNG:
@Test(groups = {"fast"})
public void testMethod() {
// Test logic here
}
JUnit:
@Test
@Category(FastTests.class)
public void testMethod() {
// Test logic here
}
TestNG allows for more granular control over test execution and grouping through annotations, while JUnit relies on separate category classes for similar functionality. TestNG's syntax is often considered more intuitive for complex testing scenarios.
Both frameworks provide robust testing capabilities for Java applications, but TestNG offers more advanced features out of the box. JUnit, being more widely adopted, has better integration with IDEs and build tools. The choice between the two often depends on project requirements and team preferences.
Java (and original) version of Hamcrest
Pros of JavaHamcrest
- More expressive and readable assertions
- Highly extensible with custom matchers
- Better error messages for failed assertions
Cons of JavaHamcrest
- Steeper learning curve for new users
- Requires additional dependency in projects
- Can be verbose for simple assertions
Code Comparison
JUnit Framework:
assertEquals(expected, actual);
assertTrue(condition);
assertFalse(condition);
JavaHamcrest:
assertThat(actual, is(equalTo(expected)));
assertThat(condition, is(true));
assertThat(condition, is(false));
JavaHamcrest provides more descriptive and flexible assertions, allowing for better readability and customization. However, it can be more verbose for simple cases. JUnit Framework offers simpler, more straightforward assertions that are easier to understand for beginners but may lack the expressiveness of Hamcrest matchers.
Both libraries are widely used in Java testing, with JUnit being more popular and established, while Hamcrest offers additional flexibility and improved readability for complex assertions. Many developers use them in combination, leveraging the strengths of both libraries in their test suites.
AssertJ is a library providing easy to use rich typed assertions
Pros of AssertJ
- More fluent and readable assertion syntax
- Richer set of assertions for collections, strings, and objects
- Better error messages with detailed comparisons
Cons of AssertJ
- Steeper learning curve for developers familiar with JUnit assertions
- Larger library size, potentially increasing project dependencies
Code Comparison
JUnit assertions:
assertEquals(expected, actual);
assertTrue(condition);
assertNotNull(object);
AssertJ assertions:
assertThat(actual).isEqualTo(expected);
assertThat(condition).isTrue();
assertThat(object).isNotNull();
AssertJ provides a more fluent and expressive syntax, allowing for chained assertions and more descriptive error messages. The assertThat()
method serves as the entry point for all assertions, making the API more consistent and easier to remember.
While JUnit assertions are more concise, AssertJ offers a wider range of assertion methods and better readability, especially for complex assertions. AssertJ also provides more detailed failure messages, which can be helpful for debugging.
However, developers already familiar with JUnit may need some time to adapt to AssertJ's syntax and extensive API. Additionally, AssertJ is a separate library, which may increase project dependencies compared to using JUnit's built-in assertions.
The Enterprise-ready testing and specification framework.
Pros of Spock
- More expressive and readable test syntax using Groovy
- Built-in support for data-driven testing and mocking
- Powerful assertion mechanism with detailed failure messages
Cons of Spock
- Requires learning Groovy for developers unfamiliar with the language
- Smaller community and ecosystem compared to JUnit
- May have slower adoption in traditional Java-centric organizations
Code Comparison
JUnit example:
@Test
public void testAddition() {
assertEquals(4, Calculator.add(2, 2));
}
Spock example:
def "addition should work correctly"() {
expect:
Calculator.add(2, 2) == 4
}
Key Differences
- Spock uses Groovy's expressive syntax, while JUnit uses standard Java
- Spock's
expect
block combines assertion and execution, making tests more concise - Spock provides more descriptive test names by default
Conclusion
Spock offers a more modern and expressive testing framework, particularly suited for projects using Groovy or those seeking more readable tests. JUnit remains a solid choice for Java-centric projects and benefits from its widespread adoption and extensive ecosystem. The choice between the two often depends on project requirements, team preferences, and existing technology stack.
Convert
designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
JUnit
This repository is the home of JUnit Platform, Jupiter, and Vintage.
Sponsors
- Gold Sponsors: JetBrains, Netflix
- Silver Sponsors: Micromata, Quo Card
- Bronze Sponsors: Premium Minds, codefortynine, Info Support, Code Intelligence, Route4Me, Testiny
Latest Releases
- General Availability (GA): JUnit 5.13.4 (July 21, 2025)
- Preview (Milestone/Release Candidate): JUnit 6.0.0-M2 (July 22, 2025)
Documentation
Contributing
Contributions to JUnit are both welcomed and appreciated. For specific guidelines
regarding contributions, please see CONTRIBUTING.md in the root directory of the
project. Those willing to use milestone or SNAPSHOT releases are encouraged
to file feature requests and bug reports using the project's
issue tracker. Issues marked with an
up-for-grabs
label are specifically targeted for community contributions.
Getting Help
Ask JUnit-related questions on StackOverflow or use the Q&A category on GitHub Discussions.
Continuous Integration Builds
Official CI build server used to perform quick checks on submitted pull requests and for build matrices including the latest released OpenJDK and early access builds of the next OpenJDK.
Code Coverage
Code coverage using JaCoCo for the latest build is available on Codecov.
A code coverage report can also be generated locally via the Gradle Wrapper by
executing ./gradlew clean jacocoRootReport
. The results will be available
in build/reports/jacoco/jacocoRootReport/html/index.html
.
Develocity
JUnit utilizes Develocity for Build Scans, Build Cache, and Predictive Test Selection.
The latest Build Scans are available on ge.junit.org. Currently,
only core team members can publish Build Scans on that server.
You can, however, publish a Build Scan to scans.gradle.com by
using the --scan
parameter explicitly.
The remote Build Cache is enabled by default for everyone so that local builds can reuse task outputs from previous CI builds.
Building from Source
You need JDK 24 to build JUnit. Gradle toolchains are used to detect and potentially download additional JDKs for compilation and test execution.
All modules can be built and tested with the Gradle Wrapper using the following command:
./gradlew build
All modules can be installed in a local Maven repository for consumption in other local projects via the following command:
./gradlew publishToMavenLocal
Dependency Metadata
Consult the Dependency Metadata section of the User Guide for a list of all artifacts of the JUnit Platform, JUnit Jupiter, and JUnit Vintage.
Top Related Projects
Most popular Mocking framework for unit tests written in Java
TestNG testing framework
Java (and original) version of Hamcrest
AssertJ is a library providing easy to use rich typed assertions
The Enterprise-ready testing and specification framework.
Convert
designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot