Mockito in Spring Boot


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:

  1. @Mock → mocks the dependency.
  2. @InjectMocks → injects mocks into the service.
  3. MockitoAnnotations.openMocks(this) → initializes mocks.
  4. when(...).thenReturn(...) → defines mock behavior.
  5. verify(...) → ensures certain methods are called.

Leave a Reply