Spring webflux, testing `ServerResponse`
So, it seems that the best solution is to use the WebTestClient
. However this one can be used without a running server;
The
spring-test
module includes aWebTestClient
that can be used to test WebFlux server endpoints with or without a running server.
The trick is to use the bindTo..()
builder method. In my case bindToRouterFunction(new MyRouter(new MyHandler()))
works well
I had exactly the same question, because I don't want to start the entire Spring context for every test. Thanks for the info in the own-answer, this helped me. Here is a complete example including Mockito and JUnit5:
import java.util.Arrays;import org.junit.jupiter.api.BeforeEach;import org.junit.jupiter.api.Test;import org.junit.jupiter.api.extension.ExtendWith;import org.mockito.Mock;import org.mockito.Mockito;import org.mockito.junit.jupiter.MockitoExtension;import org.springframework.http.MediaType;import org.springframework.test.web.reactive.server.WebTestClient;@ExtendWith(MockitoExtension.class)class UsersHandlerTest { @Mock UserRepository userRepository; WebTestClient client; @BeforeEach public void setUp() { UsersHandler usersHandler = new UsersHandler(userRepository); Router router = new Router(usersHandler); Mockito.when(userRepository.findAll()).thenReturn( Arrays.asList("", "")); client = WebTestClient.bindToRouterFunction(router.getUsers()).build(); } @Test public void getCommands() { client.get().uri("/users") .accept(MediaType.APPLICATION_JSON_UTF8) .exchange() .expectStatus().isOk() .expectBody().json("{}"); }}
I have asked a similar question insisting not to use WebTestClient.I have ended up answering my own question after discovering that it is possible to cast the response to a type that allows inspecting body (entity).
The magic line (Kotlin) is:
(serverResponse as EntityResponse<Fleet>).entity()
Edit:So for the case of expecting an empty body, you could do:
assert(serverResponse !is EntityResponse<*>)
Thanks for @andred for pointing this out