eBook – Guide Spring Cloud – NPI EA (cat=Spring Cloud)
announcement - icon

Let's get started with a Microservice Architecture with Spring Cloud:

>> Join Pro and download the eBook

eBook – Mockito – NPI EA (tag = Mockito)
announcement - icon

Mocking is an essential part of unit testing, and the Mockito library makes it easy to write clean and intuitive unit tests for your Java code.

Get started with mocking and improve your application tests using our Mockito guide:

Download the eBook

eBook – Java Concurrency – NPI EA (cat=Java Concurrency)
announcement - icon

Handling concurrency in an application can be a tricky process with many potential pitfalls. A solid grasp of the fundamentals will go a long way to help minimize these issues.

Get started with understanding multi-threaded applications with our Java Concurrency guide:

>> Download the eBook

eBook – Reactive – NPI EA (cat=Reactive)
announcement - icon

Spring 5 added support for reactive programming with the Spring WebFlux module, which has been improved upon ever since. Get started with the Reactor project basics and reactive programming in Spring Boot:

>> Join Pro and download the eBook

eBook – Java Streams – NPI EA (cat=Java Streams)
announcement - icon

Since its introduction in Java 8, the Stream API has become a staple of Java development. The basic operations like iterating, filtering, mapping sequences of elements are deceptively simple to use.

But these can also be overused and fall into some common pitfalls.

To get a better understanding on how Streams work and how to combine them with other language features, check out our guide to Java Streams:

>> Join Pro and download the eBook

eBook – Jackson – NPI EA (cat=Jackson)
announcement - icon

Do JSON right with Jackson

Download the E-book

eBook – HTTP Client – NPI EA (cat=Http Client-Side)
announcement - icon

Get the most out of the Apache HTTP Client

Download the E-book

eBook – Maven – NPI EA (cat = Maven)
announcement - icon

Get Started with Apache Maven:

Download the E-book

eBook – Persistence – NPI EA (cat=Persistence)
announcement - icon

Working on getting your persistence layer right with Spring?

Explore the eBook

eBook – RwS – NPI EA (cat=Spring MVC)
announcement - icon

Building a REST API with Spring?

Download the E-book

Course – LS – NPI EA (cat=Jackson)
announcement - icon

Get started with Spring and Spring Boot, through the Learn Spring course:

>> LEARN SPRING
Course – RWSB – NPI EA (cat=REST)
announcement - icon

Explore Spring Boot 3 and Spring 6 in-depth through building a full REST API with the framework:

>> The New “REST With Spring Boot”

Course – LSS – NPI EA (cat=Spring Security)
announcement - icon

Yes, Spring Security can be complex, from the more advanced functionality within the Core to the deep OAuth support in the framework.

I built the security material as two full courses - Core and OAuth, to get practical with these more complex scenarios. We explore when and how to use each feature and code through it on the backing project.

You can explore the course here:

>> Learn Spring Security

Course – LSD – NPI EA (tag=Spring Data JPA)
announcement - icon

Spring Data JPA is a great way to handle the complexity of JPA with the powerful simplicity of Spring Boot.

Get started with Spring Data JPA through the guided reference course:

>> CHECK OUT THE COURSE

Partner – Moderne – NPI EA (cat=Spring Boot)
announcement - icon

Refactor Java code safely — and automatically — with OpenRewrite.

Refactoring big codebases by hand is slow, risky, and easy to put off. That’s where OpenRewrite comes in. The open-source framework for large-scale, automated code transformations helps teams modernize safely and consistently.

Each month, the creators and maintainers of OpenRewrite at Moderne run live, hands-on training sessions — one for newcomers and one for experienced users. You’ll see how recipes work, how to apply them across projects, and how to modernize code with confidence.

Join the next session, bring your questions, and learn how to automate the kind of work that usually eats your sprint time.

Course – LJB – NPI EA (cat = Core Java)
announcement - icon

Code your way through and build up a solid, practical foundation of Java:

>> Learn Java Basics

Partner – LambdaTest – NPI EA (cat= Testing)
announcement - icon

Distributed systems often come with complex challenges such as service-to-service communication, state management, asynchronous messaging, security, and more.

Dapr (Distributed Application Runtime) provides a set of APIs and building blocks to address these challenges, abstracting away infrastructure so we can focus on business logic.

In this tutorial, we'll focus on Dapr's pub/sub API for message brokering. Using its Spring Boot integration, we'll simplify the creation of a loosely coupled, portable, and easily testable pub/sub messaging system:

>> Flexible Pub/Sub Messaging With Spring Boot and Dapr

Partner – Diagrid – NPI (cat= Testing)
announcement - icon

Distributed systems often come with complex challenges such as service-to-service communication, state management, asynchronous messaging, security, and more.

Dapr (Distributed Application Runtime) provides a set of APIs and building blocks to address these challenges, abstracting away infrastructure so we can focus on business logic.

In this tutorial, we'll focus on Dapr's pub/sub API for message brokering. Using its Spring Boot integration, we'll simplify the creation of a loosely coupled, portable, and easily testable pub/sub messaging system:

>> Flexible Pub/Sub Messaging With Spring Boot and Dapr

1. Introduction

Mocking is a testing technique that replaces real components with objects that have predefined behavior. This allows developers to isolate and test specific components without relying on dependencies. Mocks are objects with predefined answers to method calls, which also have expectations for executions.

In this tutorial, we’ll see how we can test a user role-based authentication service using Mockito based on different roles with the help of the Answer API provided by Mockito.

2. Maven Dependencies

Before heading into this article, adding the Mockito dependency is essential.

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>5.14.2</version>
    <scope>test</scope>
</dependency>

Let’s add the JUnit 5 dependency, as we’ll need it for some parts of our unit testing.

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>5.11.3</version>
    <scope>test</scope>
</dependency>

3. Introduction to Answer API

The Answer API allows us to customize the behavior of mocked methods by specifying what they should return when invoked. This will be useful when we want the mock to provide different responses based on the input parameters. Let us explore a few more topics to build up to our topic with a clearer understanding of concepts.

The Answer API in Mockito intercepts method calls on a mock object and redirects those calls to custom-defined behavior. This process involves internal steps that allow Mockito to simulate complex behaviors without modifying the underlying code. Let’s explore this in detail, from mock creation to the method invocation interception.

3.1. Mock Creation and Stubbing with thenAnswer()

Mock creation in Mockito starts with the mock() method, which generates a proxy of the target class using CGLib or Reflection API. This proxy is then registered internally, enabling Mockito to manage its lifecycle.

After creating the mock, we proceed to method stubbing, defining specific behaviors for methods. Mockito intercepts this call, identifies the target method and arguments, and uses the thenAnswer() method to set up a custom response. The thenAnswer() method takes an interface implementation, allowing us to specify custom behavior:

// Mocking an OrderService class
OrderService orderService = mock(OrderService.class);

// Stubbing processOrder method
when(orderService.processOrder(anyString())).thenAnswer(invocation -> {
    String orderId = invocation.getArgument(0);
    return "Order " + orderId + " processed successfully";
});

// Using the stubbed method
String result = orderService.processOrder("12345");
System.out.println(result);  // Output: Order 12345 processed successfully

Here, processOrder() is stubbed to return a message with the order ID. When called, Mockito intercepts and applies the custom Answer logic.

3.2. Method Invocation Interception

Understanding how Mockito’s Answer API works is essential for setting up flexible behavior in tests. Let’s break down the internal process that occurs when a method is called on a mock during test execution:

  • When a method is called on the mock, the call is redirected to Mockito’s internal handling mechanism through the proxy instance.
  • Mockito checks if a behavior has been registered for that method. It uses the method signature to find the appropriate Answer implementation.
  • If an Answer implementation is found, then the information about the arguments passed to the method, method signature, and the reference to the mock object is stored in an instance of the InvocationOnMock class.
  • Using InvocationOnMock, we can access method arguments with getArgument(int index) to control the method’s behavior dynamically

This internal process enables the Answer API to respond dynamically based on context. Consider a content management system where user permissions vary by role. We can use the Answer API to simulate authorization dynamically, depending on the user’s role and requested action. Let’s see how we’ll implement this in the following sections.

4. Creating Models of User and Action

Since we’ll use a content management system as an example, we’ll have four roles: Admin, Editor, Viewer, and Guest. These roles will serve as basic authorization for different CRUD operations. An Admin can perform all actions, an Editor can create, read, and update, a Viewer can only read content, and a Guest has no access to any actions. Let us start by creating a User class:

public class CmsUser {
    private String username;
    private String role;
    
    public CmsUser(String username, String role) {
        this.username = username;
        this.role = role;
    }

    public String getRole() {
        return this.role;
    }
}

Now, let’s define an enumeration to capture the possible CRUD operations using the ActionEnum class:

public enum ActionEnum {
    CREATE, READ, UPDATE, DELETE;
}

With ActionEnum defined, we’re ready to start with the service layer. Let’s begin by defining the AuthorizationService interface. This interface will contain a method to check whether a user can perform a specific CRUD action:

public interface AuthorizationService {
    boolean authorize(CmsUser user, ActionEnum actionEnum);
}

This method will return whether a given CmsUser is eligible for performing the given CRUD operation. Now that we’re done with this, we can move forward to see the actual implementation of the Answer API.

5. Creating Tests for AuthorizationService

We begin by creating a mock version of the AuthorizationService interface:

@Mock
private AuthorizationService authorizationService;

Now, let’s create a setup method that initializes mocks and defines a default behavior for the authorize() method in AuthorizationService, allowing it to simulate different user permissions based on roles:

@Before
public void setup() {
    MockitoAnnotations.initMocks(this);
    when(this.authorizationService.authorize(any(CmsUser.class), any(ActionEnum.class)))
      .thenAnswer(invocation -> {
          CmsUser user = invocation.getArgument(0);
          ActionEnum action = invocation.getArgument(1);
          switch(user.getRole()) {
              case "ADMIN": return true;
              case "EDITOR": return action != ActionEnum.DELETE;
              case "VIEWER": return action == ActionEnum.READ;
              case "GUEST":
              default: return false;
          }
      });
}

In this setup method, we initialize our test class’s mocks, which prepares any mocked dependencies for use before each test run. Next, we define the behavior of the authorize() method in the authorizationService mock by using when(this.authorizationService.authorize(…)).thenAnswer(…). This setup specifies a custom answer: whenever the authorize() method is called with any CmsUser and any ActionEnum, it responds according to the user’s role.

To verify the correctness, we can run the givenRoles_whenInvokingAuthorizationService_thenReturnExpectedResults() from the code repository.

6. Verifying Our Implementations

Now that we are complete with everything, let’s create test methods for verifying our implementation.

@Test
public void givenRoles_whenInvokingAuthorizationService_thenReturnExpectedResults() {
   CmsUser adminUser = createCmsUser("Admin User", "ADMIN");
   CmsUser guestUser = createCmsUser("Guest User", "GUEST");
   CmsUser editorUser = createCmsUser("Editor User", "EDITOR");
   CmsUser viewerUser = createCmsUser("Viewer User", "VIEWER");

   verifyAdminUserAccess(adminUser);
   verifyEditorUserAccess(editorUser);
   verifyViewerUserAccess(viewerUser);
   verifyGuestUserAccess(guestUser);
}

Let’s focus on one of the verify methods to maintain the brevity of the article. We’ll go through the implementation to verify the admin user’s access, and we can refer to the code repository to understand the implementations for the other user roles.

We start by creating CmsUser instances for the different roles. Then, we invoke the verifyAdminUserAccess() method, passing the adminUser instance as an argument. Inside the verifyAdminUserAccess() method, we iterate through all the ActionEnum values and assert that the admin user has access to all of them. This verifies that the authorization service correctly grants the admin user full access to all actions. Implementing the other user role verification methods follows a similar pattern, and we can explore those in the code repository if we need further understanding.

7. Conclusion

In this article, we examined how Mockito’s Answer API can be used to dynamically implement role-based authorization logic in mock testing. By setting up role-based access for users, we showed how to return varied responses depending on the properties of specific parameters. This method enhances code coverage and minimizes the chances of unforeseen failures, making our tests both more dependable and effective.

The code backing this article is available on GitHub. Once you're logged in as a Baeldung Pro Member, start learning and coding on the project.
Baeldung Pro – NPI EA (cat = Baeldung)
announcement - icon

Baeldung Pro comes with both absolutely No-Ads as well as finally with Dark Mode, for a clean learning experience:

>> Explore a clean Baeldung

Once the early-adopter seats are all used, the price will go up and stay at $33/year.

eBook – HTTP Client – NPI EA (cat=HTTP Client-Side)
announcement - icon

The Apache HTTP Client is a very robust library, suitable for both simple and advanced use cases when testing HTTP endpoints. Check out our guide covering basic request and response handling, as well as security, cookies, timeouts, and more:

>> Download the eBook

eBook – Java Concurrency – NPI EA (cat=Java Concurrency)
announcement - icon

Handling concurrency in an application can be a tricky process with many potential pitfalls. A solid grasp of the fundamentals will go a long way to help minimize these issues.

Get started with understanding multi-threaded applications with our Java Concurrency guide:

>> Download the eBook

eBook – Java Streams – NPI EA (cat=Java Streams)
announcement - icon

Since its introduction in Java 8, the Stream API has become a staple of Java development. The basic operations like iterating, filtering, mapping sequences of elements are deceptively simple to use.

But these can also be overused and fall into some common pitfalls.

To get a better understanding on how Streams work and how to combine them with other language features, check out our guide to Java Streams:

>> Join Pro and download the eBook

eBook – Persistence – NPI EA (cat=Persistence)
announcement - icon

Working on getting your persistence layer right with Spring?

Explore the eBook

Course – LS – NPI EA (cat=REST)

announcement - icon

Get started with Spring Boot and with core Spring, through the Learn Spring course:

>> CHECK OUT THE COURSE

Partner – Moderne – NPI EA (tag=Refactoring)
announcement - icon

Modern Java teams move fast — but codebases don’t always keep up. Frameworks change, dependencies drift, and tech debt builds until it starts to drag on delivery. OpenRewrite was built to fix that: an open-source refactoring engine that automates repetitive code changes while keeping developer intent intact.

The monthly training series, led by the creators and maintainers of OpenRewrite at Moderne, walks through real-world migrations and modernization patterns. Whether you’re new to recipes or ready to write your own, you’ll learn practical ways to refactor safely and at scale.

If you’ve ever wished refactoring felt as natural — and as fast — as writing code, this is a good place to start.

eBook – Mockito – NPI (tag=Mockito)
announcement - icon

Mocking is an essential part of unit testing, and the Mockito library makes it easy to write clean and intuitive unit tests for your Java code.

Get started with mocking and improve your application tests using our Mockito guide:

>> Download the eBook

eBook Jackson – NPI EA – 3 (cat = Jackson)