Mockito JUnit 5 support - Extension library that integrates Mockito mocking framework with JUnit 5 testing platform
npx @tessl/cli install tessl/maven-org-mockito--mockito-junit-jupiter@4.11.0Mockito JUnit Jupiter provides seamless integration between the Mockito mocking framework and JUnit 5 testing platform through the MockitoExtension. It enables automatic mock creation, injection, and cleanup in JUnit 5 test classes using annotations like @Mock, @Spy, and @InjectMocks.
org.mockito:mockito-junit-jupiter:4.11.0// Main classes from mockito-junit-jupiter
import org.mockito.junit.jupiter.MockitoExtension;
import org.mockito.junit.jupiter.MockitoSettings;
// JUnit 5 extension support
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.api.extension.ParameterResolutionException;
// Standard Mockito annotations
import org.mockito.Mock;
import org.mockito.Spy;
import org.mockito.InjectMocks;
// Strictness configuration
import org.mockito.quality.Strictness;import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import java.util.List;
@ExtendWith(MockitoExtension.class)
public class ExampleTest {
@Mock
private List<String> mockList;
@Test
void testMockCreation() {
// Mock is automatically initialized by MockitoExtension
mockList.add("test");
// Verify or stub the mock as needed
}
}Mockito JUnit Jupiter is built around the JUnit 5 extension model:
The MockitoExtension integrates Mockito with JUnit 5's extension model to provide automatic mock management.
/**
* Extension that initializes mocks and handles strict stubbings.
* This extension is the JUnit Jupiter equivalent of MockitoJUnitRunner.
*/
public class MockitoExtension implements BeforeEachCallback, AfterEachCallback, ParameterResolver {
/**
* Default constructor invoked by JUnit Jupiter via reflection or ServiceLoader
*/
public MockitoExtension();
/**
* Callback invoked before each test is invoked
* @param context the current extension context; never null
*/
public void beforeEach(final ExtensionContext context);
/**
* Callback invoked after each test has been invoked
* @param context the current extension context; never null
*/
public void afterEach(ExtensionContext context);
/**
* Determine if this resolver supports resolution of an argument for the Parameter
* @param parameterContext the context for the parameter for which an argument should be resolved
* @param context the extension context for the test method about to be invoked
* @return true if parameter is annotated with @Mock
*/
public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext context) throws ParameterResolutionException;
/**
* Resolve an argument for the Parameter in the supplied ParameterContext
* @param parameterContext the context for the parameter for which an argument should be resolved
* @param context the extension context for the test method about to be invoked
* @return the resolved argument for the parameter
*/
public Object resolveParameter(ParameterContext parameterContext, ExtensionContext context) throws ParameterResolutionException;
}Usage Examples:
// Basic extension usage
@ExtendWith(MockitoExtension.class)
public class MyTest {
@Mock private Service service;
@Test
void testMethod() {
// service mock is automatically initialized
}
}
// Method parameter injection
@ExtendWith(MockitoExtension.class)
public class MyTest {
@Test
void testWithParameter(@Mock Repository repository) {
// repository mock is injected as method parameter
}
}
// Constructor parameter injection
@ExtendWith(MockitoExtension.class)
public class MyTest {
private final Database database;
MyTest(@Mock Database database) {
this.database = database;
}
@Test
void testMethod() {
// database mock is available as instance field
}
}The MockitoSettings annotation allows configuration of mock behavior when used with MockitoExtension.
/**
* Annotation that can configure Mockito as invoked by the MockitoExtension.
* Automatically applies @ExtendWith(MockitoExtension.class).
*/
@ExtendWith(MockitoExtension.class)
@Inherited
@Retention(RUNTIME)
public @interface MockitoSettings {
/**
* Configure the strictness used in this test.
* @return The strictness to configure, by default Strictness.STRICT_STUBS
*/
Strictness strictness() default Strictness.STRICT_STUBS;
}Usage Examples:
// Default strictness (STRICT_STUBS)
@MockitoSettings
public class StrictTest {
@Mock private Service service;
@Test
void testMethod() {
// Runs with strict stub validation
}
}
// Custom strictness configuration
@MockitoSettings(strictness = Strictness.LENIENT)
public class LenientTest {
@Mock private Service service;
@Test
void testMethod() {
// Runs with lenient stub validation
}
}
// Inherited by nested classes
@MockitoSettings(strictness = Strictness.WARN)
public class ParentTest {
@Nested
class NestedTest {
@Mock private Service service;
@Test
void testMethod() {
// Inherits WARN strictness from parent
}
}
}/**
* JUnit 5 extension context namespace for Mockito state storage
*/
interface ExtensionContext {
// Standard JUnit 5 ExtensionContext interface
}
/**
* JUnit 5 parameter context for parameter resolution
*/
interface ParameterContext {
// Standard JUnit 5 ParameterContext interface
}
/**
* Exception thrown when parameter resolution fails
*/
class ParameterResolutionException extends RuntimeException {
// Standard JUnit 5 ParameterResolutionException
}
/**
* Mockito strictness levels for stub validation
*/
enum Strictness {
STRICT_STUBS, // Default - validates all stubs are used
LENIENT, // Allows unused stubs
WARN // Warns about unused stubs
}
/**
* Mockito session for managing mock lifecycle
*/
interface MockitoSession {
// Internal Mockito session management
}
/**
* Scoped mock for automatic cleanup
*/
interface ScopedMock {
// Internal Mockito scoped mock management
}The extension works seamlessly with standard Mockito annotations:
The extension handles various error scenarios:
The extension fully supports JUnit 5 nested test classes: