DEV Community

Anh Trần Tuấn
Anh Trần Tuấn

Posted on • Originally published at tuanh.net on

Reasons to Use WireMock for Testing REST APIs in Spring Boot Applications

1. What is WireMock?

Image

WireMock is a robust HTTP mock server that allows you to simulate HTTP requests and responses, making it an essential tool for testing REST APIs. It helps create a virtual version of a service with expected inputs and outputs without requiring the actual service to be up and running. This makes it ideal for testing microservices or any applications that depend on third-party APIs.

1.1 Why Use WireMock?

There are several reasons why developers prefer WireMock for API testing:

  • Isolation : It allows you to isolate your application from external services, ensuring consistent test results.
  • Reliability : With WireMock, you can simulate different scenarios, including errors, timeouts, and retries, which might be difficult with a real API.
  • Flexibility : WireMock is highly flexible and supports various protocols like HTTP and HTTPS, JSON and XML payloads, and complex request matching.
  • Integration : It integrates well with popular testing frameworks such as JUnit and TestNG, which are widely used in Spring Boot applications.

1.2 WireMock vs. Other Mocking Tools

WireMock provides a unique set of features that differentiate it from other mocking tools:

  • Simplicity : WireMock has a straightforward setup and configuration.
  • Feature-Rich : It supports advanced features like recording and replaying requests, request verification, and more.
  • Community and Support : A large community and extensive documentation provide great support for developers.

2. How to Set Up WireMock in a Spring Boot Project

Integrating WireMock into a Spring Boot project is straightforward. Let's look at the step-by-step process of setting up WireMock in a Spring Boot application.

2.1 Adding WireMock Dependency

To use WireMock in your Spring Boot project, you need to add the WireMock dependency to your pom.xml file if you're using Maven:

<dependency>
    <groupId>com.github.tomakehurst</groupId>
    <artifactId>wiremock-jre8</artifactId>
    <version>2.35.0</version>
    <scope>test</scope>
</dependency>
Enter fullscreen mode Exit fullscreen mode

Or if you’re using Gradle, add the following to your build.gradle file:

testImplementation 'com.github.tomakehurst:wiremock-jre8:2.35.0'
Enter fullscreen mode Exit fullscreen mode

2.2 Writing a Simple Test with WireMock

Once you have added the dependency, let's create a simple REST client in our Spring Boot application and write a test using WireMock.

Step 1: Create a REST Client

Create a simple REST client in your Spring Boot application that calls a third-party API:

import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class ApiService {
    private final RestTemplate restTemplate = new RestTemplate();

    public String getExternalData() {
        String url = "http://external-service/api/data";
        return restTemplate.getForObject(url, String.class);
    }
}
Enter fullscreen mode Exit fullscreen mode

Step 2: Write a WireMock Test

Next, write a test class using JUnit and WireMock to mock the external service:

import com.github.tomakehurst.wiremock.client.WireMock;
import com.github.tomakehurst.wiremock.junit5.WireMockTest;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
import static com.github.tomakehurst.wiremock.client.WireMock.get;
import static org.junit.jupiter.api.Assertions.assertEquals;

@SpringBootTest
@WireMockTest(httpPort = 8080)
public class ApiServiceTest {

    @Autowired
    private ApiService apiService;

    @Test
    void testGetExternalData() {
        WireMock.stubFor(get("/api/data")
                .willReturn(aResponse()
                        .withStatus(200)
                        .withBody("{"message": "Hello from WireMock"}")));

        String response = apiService.getExternalData();
        assertEquals("{"message": "Hello from WireMock"}", response);
    }
}
Enter fullscreen mode Exit fullscreen mode

2.3 Explanation of the Test

In the above test:

  • We use the @WireMockTest annotation to start WireMock on port 8080.
  • We use WireMock.stubFor to configure a mock response for the /api/data endpoint.
  • The test method testGetExternalData verifies that our ApiService returns the expected response from the mocked API.

2.4 Running the Test

Run the test using your IDE or build tool. The test should pass, demonstrating that WireMock successfully mocked the external API.

3. Advanced WireMock Features

WireMock offers several advanced features that make it even more powerful for API testing.

3.1 Request Verification

WireMock allows you to verify that specific requests were made during a test. This is useful when you want to ensure that your application is making the correct API calls.

WireMock.verify(getRequestedFor(urlEqualTo("/api/data")));
Enter fullscreen mode Exit fullscreen mode

3.2 Simulating Delays and Failures

You can simulate network delays and failures to test how your application handles them. For example, to simulate a delay:

WireMock.stubFor(get("/api/data")
        .willReturn(aResponse()
                .withFixedDelay(2000) // 2-second delay
                .withBody("{"message": "Delayed response"}")));
Enter fullscreen mode Exit fullscreen mode

This is particularly useful for testing timeout handling and retry logic.

4. Integrating WireMock with Spring Boot Tests

While the above example demonstrates a basic use case, WireMock can be integrated more deeply with Spring Boot test configurations for more comprehensive tests.

4.1 Configuring WireMock with Spring Boot

You can use WireMock with Spring Boot's @MockBean or @TestConfiguration to configure more advanced scenarios. This allows for greater flexibility and integration in real-world applications.

4.2 Example with @MockBean

Here's how you can use @MockBean in a Spring Boot test:

@SpringBootTest
public class ApplicationTests {

    @MockBean
    private ExternalService externalService;

    @Test
    void contextLoads() {
        // Configure WireMock to simulate responses
    }
}
Enter fullscreen mode Exit fullscreen mode

5. Conclusion

WireMock is a versatile and powerful tool for mocking HTTP requests and responses in Spring Boot applications. It allows developers to create reliable and repeatable tests by simulating different scenarios, thereby improving the robustness of the application. By integrating WireMock into your test suite, you can ensure your application handles external dependencies gracefully and remains resilient under various conditions.

If you have any questions or need further clarification on how to use WireMock in your Spring Boot application, feel free to leave a comment below. Your feedback helps us create more informative and engaging content!

Read posts more at : Reasons to Use WireMock for Testing REST APIs in Spring Boot Applications

Top comments (0)