Skip to content

Spring Reactive (Webflux) Client + Tests

Notifications You must be signed in to change notification settings

hamzemostafaei/async-client

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Async Clients

I received the following question from a YouTube subscriber and I thought it was a good one to answer:

Could you provide a video covering asynchronous requests using WebClient or another library that can offer this? And if possible, how to do unit tests as well, as that would be very helpful!

Getting Started

To create a new Spring Boot project head over to start.spring.io. Create a new project with the Spring WebFlux Dependency

Post Client

The PostClient contains all of the logic for communicating with a public API, JsonPlaceholderService. Normally in this class I would just have Spring autowire in the DefaultWebClientBuilder

@Component
public class PostClient {

    private final WebClient webClient;

    public PostClient(WebClient.Builder builder) {
        this.webClient = builder
                .baseUrl("(https://jsonplaceholder.typicode.com/")
                .build();
    }

}

This makes it harder to test because you're hardcoding the baseUrl here and it makes it impossible to override. A better solution is to have the PostClient accept a WebClient. This way you can configure a bean of type WebClient in a configuration class and you can pass one in for tests.

@Bean
WebClient webClient(WebClient.Builder builder) {
    return builder.baseUrl("https://jsonplaceholder.typicode.com").build();
}
@Component
public class PostClient {

    private final WebClient webClient;

    public PostClient(WebClient webClient) {
        this.webClient = webClient;
    }

}

Writing Tests against the Post Client

These are the different tests I have written for the PostClient and what they are used for.

PostClientTest

This is a true unit test but given the nature of the WebClient's fluent API this can become a little bit tricky to mock out.

PostClientMockWebServerTest

A better approach is to start a local HTTP server and mock the HTTP responses from the remote system.

Thanks to Phillip Riecks for his wondering Testing Resources.

PostClientIntTest

Use a live web server on a random port and call the real service.

PostControllerIntTest

If you have a controller that calls the post client you can use the WebTestClient.

The WebTestClient is a client for testing web servers that uses WebClient internally to perform requests while also providing a fluent API to verify responses. This client can connect to any server over HTTP, or to a WebFlux application via mock request and response objects.

About

Spring Reactive (Webflux) Client + Tests

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 100.0%