1. Spring Boot Setup
Suppose we have a simple app that manages users.
User
model:
package com.example.demo.model;
public class User {
private Long id;
private String name;
// Constructors
public User() {}
public User(Long id, String name) {
this.id = id;
this.name = name;
}
// Getters & Setters
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
UserRepository
(simulated repository):
package com.example.demo.repository;
import com.example.demo.model.User;
import java.util.Optional;
public interface UserRepository {
Optional<User> findById(Long id);
}
UserService
:
package com.example.demo.service;
import com.example.demo.model.User;
import com.example.demo.repository.UserRepository;
import org.springframework.stereotype.Service;
import java.util.Optional;
@Service
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public String getUserName(Long id) {
Optional<User> user = userRepository.findById(id);
return user.map(User::getName).orElse("User Not Found");
}
}
UserController
:
package com.example.demo.controller;
import com.example.demo.service.UserService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping("/user/{id}")
public String getUserName(@PathVariable Long id) {
return userService.getUserName(id);
}
}
2. Mockito Unit Test
We’ll write a test for UserService
using Mockito.
UserServiceTest
:
package com.example.demo.service;
import com.example.demo.model.User;
import com.example.demo.repository.UserRepository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.util.Optional;
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;
class UserServiceTest {
@Mock
private UserRepository userRepository;
@InjectMocks
private UserService userService;
@BeforeEach
void setUp() {
MockitoAnnotations.openMocks(this);
}
@Test
void testGetUserName_UserFound() {
User user = new User(1L, "Alice");
when(userRepository.findById(1L)).thenReturn(Optional.of(user));
String name = userService.getUserName(1L);
assertEquals("Alice", name);
verify(userRepository, times(1)).findById(1L);
}
@Test
void testGetUserName_UserNotFound() {
when(userRepository.findById(2L)).thenReturn(Optional.empty());
String name = userService.getUserName(2L);
assertEquals("User Not Found", name);
verify(userRepository, times(1)).findById(2L);
}
}
✅ Key Points:
@Mock
→ mocks the dependency.@InjectMocks
→ injects mocks into the service.MockitoAnnotations.openMocks(this)
→ initializes mocks.when(...).thenReturn(...)
→ defines mock behavior.verify(...)
→ ensures certain methods are called.