To use Mockito with JUnit, you add Mockito to your test dependencies, enable Mockito in your JUnit test class, then create mocks and define their behavior.
Below is a simple JUnit 5 + Mockito example.
1. Add Dependencies
Maven
<dependencies>
<!-- JUnit 5 -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.11.4</version>
<scope>test</scope>
</dependency>
<!-- Mockito Core -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>5.14.2</version>
<scope>test</scope>
</dependency>
<!-- Mockito integration for JUnit 5 -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>5.14.2</version>
<scope>test</scope>
</dependency>
</dependencies>
Make sure your Maven Surefire plugin supports JUnit 5:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.5.2</version>
</plugin>
</plugins>
</build>
Gradle
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter:5.11.4'
testImplementation 'org.mockito:mockito-core:5.14.2'
testImplementation 'org.mockito:mockito-junit-jupiter:5.14.2'
}
test {
useJUnitPlatform()
}
2. Example Class to Test
Suppose you have a service that depends on a repository.
public class User {
private final Long id;
private final String name;
public User(Long id, String name) {
this.id = id;
this.name = name;
}
public Long getId() {
return id;
}
public String getName() {
return name;
}
}
import java.util.Optional;
public interface UserRepository {
Optional<User> findById(Long id);
}
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public String getUserName(Long id) {
return userRepository.findById(id)
.map(User::getName)
.orElse("Unknown User");
}
}
3. Write a Mockito Test with JUnit 5
Use @ExtendWith(MockitoExtension.class) to enable Mockito support.
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import java.util.Optional;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class UserServiceTest {
@Mock
private UserRepository userRepository;
@InjectMocks
private UserService userService;
@Test
void shouldReturnUserNameWhenUserExists() {
User user = new User(1L, "Alice");
when(userRepository.findById(1L))
.thenReturn(Optional.of(user));
String result = userService.getUserName(1L);
assertEquals("Alice", result);
verify(userRepository).findById(1L);
}
@Test
void shouldReturnUnknownUserWhenUserDoesNotExist() {
when(userRepository.findById(99L))
.thenReturn(Optional.empty());
String result = userService.getUserName(99L);
assertEquals("Unknown User", result);
verify(userRepository).findById(99L);
}
}
4. What the Mockito Annotations Mean
| Annotation | Purpose |
|---|---|
@Mock |
Creates a mock object |
@InjectMocks |
Creates the class under test and injects mocks into it |
@ExtendWith(MockitoExtension.class) |
Enables Mockito support in JUnit 5 |
5. Common Mockito Methods
when(...).thenReturn(...)
Used to define mock behavior.
when(userRepository.findById(1L))
.thenReturn(Optional.of(new User(1L, "Alice")));
verify(...)
Used to check whether a method was called.
verify(userRepository).findById(1L);
verify(..., times(...))
Used to check how many times a method was called.
verify(userRepository, times(1)).findById(1L);
You need this static import:
import static org.mockito.Mockito.times;
6. Mockito Without Annotations
You can also create mocks manually.
import org.junit.jupiter.api.Test;
import java.util.Optional;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
class UserServiceManualMockTest {
@Test
void shouldReturnUserName() {
UserRepository userRepository = mock(UserRepository.class);
UserService userService = new UserService(userRepository);
when(userRepository.findById(1L))
.thenReturn(Optional.of(new User(1L, "Alice")));
String result = userService.getUserName(1L);
assertEquals("Alice", result);
}
}
7. Typical Mockito Test Structure
A clean Mockito test usually follows the Arrange, Act, Assert pattern:
@Test
void shouldReturnUserName() {
// Arrange
User user = new User(1L, "Alice");
when(userRepository.findById(1L)).thenReturn(Optional.of(user));
// Act
String result = userService.getUserName(1L);
// Assert
assertEquals("Alice", result);
verify(userRepository).findById(1L);
}
Summary
To use Mockito with JUnit 5:
- Add
mockito-coreandmockito-junit-jupiter. - Add
@ExtendWith(MockitoExtension.class)to your test class. - Use
@Mockfor dependencies. - Use
@InjectMocksfor the class being tested. - Use
when(...).thenReturn(...)to define behavior. - Use
verify(...)to check interactions.
