Move articles from spring-core-6 module to other spring-boot modules (#13722)

* Move articles from spring-core-6 module to other spring-boot modules

* JAVA-19559 Move articles from spring-core-6 module to other spring-boot-3 modules

* JAVA-19559 Minor spacing change

* JAVA-19559 Revert  Minor spacing change
This commit is contained in:
anuragkumawat 2023-03-30 21:53:07 +05:30 committed by GitHub
parent 99d11182ab
commit e310fe84da
18 changed files with 143 additions and 446 deletions

View File

@ -5,3 +5,4 @@
- [Singleton Design Pattern vs Singleton Beans in Spring Boot](https://www.baeldung.com/spring-boot-singleton-vs-beans) - [Singleton Design Pattern vs Singleton Beans in Spring Boot](https://www.baeldung.com/spring-boot-singleton-vs-beans)
- [Migrate Application From Spring Boot 2 to Spring Boot 3](https://www.baeldung.com/spring-boot-3-migration) - [Migrate Application From Spring Boot 2 to Spring Boot 3](https://www.baeldung.com/spring-boot-3-migration)
- [Using Java Records with JPA](https://www.baeldung.com/spring-jpa-java-records) - [Using Java Records with JPA](https://www.baeldung.com/spring-jpa-java-records)
- [HTTP Interface in Spring 6](https://www.baeldung.com/spring-6-http-interface)

View File

@ -32,6 +32,20 @@
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId> <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.mock-server</groupId>
<artifactId>mockserver-netty</artifactId>
<version>${mockserver.version}</version>
</dependency>
<dependency>
<groupId>org.mock-server</groupId>
<artifactId>mockserver-client-java</artifactId>
<version>${mockserver.version}</version>
</dependency>
<dependency> <dependency>
<groupId>com.h2database</groupId> <groupId>com.h2database</groupId>
<artifactId>h2</artifactId> <artifactId>h2</artifactId>
@ -125,7 +139,7 @@
<springdoc.version>2.0.0</springdoc.version> <springdoc.version>2.0.0</springdoc.version>
<maven-surefire-plugin.version>3.0.0-M7</maven-surefire-plugin.version> <maven-surefire-plugin.version>3.0.0-M7</maven-surefire-plugin.version>
<start-class>com.baeldung.sample.TodoApplication</start-class> <start-class>com.baeldung.sample.TodoApplication</start-class>
<mockserver.version>5.14.0</mockserver.version>
</properties> </properties>
</project> </project>

View File

@ -15,12 +15,12 @@ interface BooksService {
List<Book> getBooks(); List<Book> getBooks();
@GetExchange("/books/{id}") @GetExchange("/books/{id}")
Book getBook(@PathVariable long id); Book getBook(@PathVariable("id") long id);
@PostExchange("/books") @PostExchange("/books")
Book saveBook(@RequestBody Book book); Book saveBook(@RequestBody Book book);
@DeleteExchange("/books/{id}") @DeleteExchange("/books/{id}")
ResponseEntity<Void> deleteBook(@PathVariable long id); ResponseEntity<Void> deleteBook(@PathVariable("id") long id);
} }

View File

@ -10,3 +10,5 @@
- [Load Spring Boot Properties From a JSON File](https://www.baeldung.com/spring-boot-json-properties) - [Load Spring Boot Properties From a JSON File](https://www.baeldung.com/spring-boot-json-properties)
- [IntelliJ Cannot Resolve Spring Boot Configuration Properties Error](https://www.baeldung.com/intellij-resolve-spring-boot-configuration-properties) - [IntelliJ Cannot Resolve Spring Boot Configuration Properties Error](https://www.baeldung.com/intellij-resolve-spring-boot-configuration-properties)
- [Log Properties in a Spring Boot Application](https://www.baeldung.com/spring-boot-log-properties) - [Log Properties in a Spring Boot Application](https://www.baeldung.com/spring-boot-log-properties)
- [Using Environment Variables in Spring Boots application.properties](https://www.baeldung.com/spring-boot-properties-env-variables)
- More articles: [[<-- prev]](../spring-boot-properties-2)

View File

@ -1,20 +1,20 @@
package com.baeldung.envvariables.valueinjection; package com.baeldung.envvariables;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@Component @Component
@ConfigurationProperties(prefix = "baeldung") @ConfigurationProperties(prefix = "baeldung")
public class BaeldungProperties { public class BaeldungProperties {
private String presentation; private String presentation;
public String getPresentation() { public String getPresentation() {
return presentation; return presentation;
} }
public void setPresentation(String presentation) { public void setPresentation(String presentation) {
this.presentation = presentation; this.presentation = presentation;
} }
} }

View File

@ -1,60 +1,60 @@
package com.baeldung.envvariables.valueinjection; package com.baeldung.envvariables;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment; import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@RestController @RestController
public class MyController { public class MyController {
@Value("${environment.name}") @Value("${environment.name}")
private String environmentName; private String environmentName;
@Value("${java.home.and.environment}") @Value("${java.home.and.environment}")
private String javaHomeAndEnvironmentName; private String javaHomeAndEnvironmentName;
@Value("${thispropertydoesnotexist}") @Value("${thispropertydoesnotexist}")
private String nonExistentProperty; private String nonExistentProperty;
@Value("${baeldung.presentation}") @Value("${baeldung.presentation}")
private String baeldungPresentation; private String baeldungPresentation;
@Autowired @Autowired
private Environment environment; private Environment environment;
@Autowired @Autowired
private BaeldungProperties baeldungProperties; private BaeldungProperties baeldungProperties;
@GetMapping("/environment_name") @GetMapping("/environment_name")
String getEnvironmentName_FromEnvironmentVariables() { String getEnvironmentName_FromEnvironmentVariables() {
return environmentName; return environmentName;
} }
@GetMapping("/java_home_and_environment") @GetMapping("/java_home_and_environment")
String getJavaHomeAndEnvironmentName_FromEnvironmentVariables() { String getJavaHomeAndEnvironmentName_FromEnvironmentVariables() {
return javaHomeAndEnvironmentName; return javaHomeAndEnvironmentName;
} }
@GetMapping("non_existent_property") @GetMapping("non_existent_property")
String getNonexistentProperty_FromEnvironmentVariables() { String getNonexistentProperty_FromEnvironmentVariables() {
return nonExistentProperty; return nonExistentProperty;
} }
@GetMapping("baeldung_presentation_from_value") @GetMapping("baeldung_presentation_from_value")
String getBaeldungPresentation_FromValue() { String getBaeldungPresentation_FromValue() {
return baeldungPresentation; return baeldungPresentation;
} }
@GetMapping("baeldung_presentation_from_environment") @GetMapping("baeldung_presentation_from_environment")
String getBaeldungPresentation_FromEnvironment() { String getBaeldungPresentation_FromEnvironment() {
return environment.getProperty("baeldung.presentation"); return environment.getProperty("baeldung.presentation");
} }
@GetMapping("baeldung_configuration_properties") @GetMapping("baeldung_configuration_properties")
String getBaeldungPresentation_FromConfigurationProperties() { String getBaeldungPresentation_FromConfigurationProperties() {
return baeldungProperties.getPresentation(); return baeldungProperties.getPresentation();
} }
} }

View File

@ -26,4 +26,9 @@ spring.config.activate.on-profile=multidocument-prod
spring.datasource.password=password spring.datasource.password=password
spring.datasource.url=jdbc:h2:prod spring.datasource.url=jdbc:h2:prod
spring.datasource.username=prodUser spring.datasource.username=prodUser
bael.property=prodValue bael.property=prodValue
#---
environment.name=${OS}
java.home.and.environment=${JAVA_HOME}+${OS}
not.existing.system.property=${thispropertydoesnotexist}
baeldung.presentation=${HELLO_BAELDUNG}. Java is installed in the folder: ${JAVA_HOME}

View File

@ -1,36 +1,36 @@
package com.baeldung.envvariables.valueinjection; package com.baeldung.envvariables;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MockMvc;
@SpringBootTest(classes = MyController.class) @SpringBootTest(classes = MyController.class)
@AutoConfigureMockMvc @AutoConfigureMockMvc
public class MyControllerIntegrationTest { public class MyControllerIntegrationTest {
@Autowired @Autowired
private MockMvc mockMvc; private MockMvc mockMvc;
/** NB : these tests are commented out because they are environment dependent /** NB : these tests are commented out because they are environment dependent
* If you want to run one of them on your machine, follow the instruction above it * If you want to run one of them on your machine, follow the instruction above it
* *
* expects the value of your system environment property 'OS' (it is already defined at least in Windows_NT) * expects the value of your system environment property 'OS' (it is already defined at least in Windows_NT)
@Test void givenExistingSystemProperty_whenInjected_thenHasSystemPropertyValue() throws Exception { @Test void givenExistingSystemProperty_whenInjected_thenHasSystemPropertyValue() throws Exception {
mockMvc.perform(get("/environment_name")) mockMvc.perform(get("/environment_name"))
.andExpect(content().string(equalTo("Windows_NT"))); .andExpect(content().string(equalTo("Windows_NT")));
} }
* expects the value of the JAVA_HOME environment variable (you need to define it if you haven't yet), with a + and the 'OS' environment property in the end * expects the value of the JAVA_HOME environment variable (you need to define it if you haven't yet), with a + and the 'OS' environment property in the end
@Test void givenCombinationOfSystemPropertyAndEnvironmentVariable_whenInjected_thenHasExpectedValue() throws Exception { @Test void givenCombinationOfSystemPropertyAndEnvironmentVariable_whenInjected_thenHasExpectedValue() throws Exception {
mockMvc.perform(get("/java_home_and_environment")) mockMvc.perform(get("/java_home_and_environment"))
.andExpect(content().string(equalTo("C:\\Program Files\\Java\\jdk-11.0.14+Windows_NT"))); .andExpect(content().string(equalTo("C:\\Program Files\\Java\\jdk-11.0.14+Windows_NT")));
} }
* expects the content to be ${thispropertydoesnotexist} ; if you have defined an environment property called thispropertydoesnotexist, it would fail * expects the content to be ${thispropertydoesnotexist} ; if you have defined an environment property called thispropertydoesnotexist, it would fail
@Test void givenNonExistentProperty_whenInjected_thenKeepsTheStringValue() throws Exception { @Test void givenNonExistentProperty_whenInjected_thenKeepsTheStringValue() throws Exception {
mockMvc.perform(get("/non_existent_property")) mockMvc.perform(get("/non_existent_property"))
.andExpect(content().string(equalTo("${thispropertydoesnotexist}"))); .andExpect(content().string(equalTo("${thispropertydoesnotexist}")));
} }
*/ */
} }

View File

@ -1,6 +1,5 @@
### Relevant Articles: ### Relevant Articles:
- [Using Environment Variables in Spring Boots application.properties](https://www.baeldung.com/spring-boot-properties-env-variables)
- [Reinitialize Singleton Bean in Spring Context](https://www.baeldung.com/spring-reinitialize-singleton-bean) - [Reinitialize Singleton Bean in Spring Context](https://www.baeldung.com/spring-reinitialize-singleton-bean)
- [HTTP Interface in Spring 6](https://www.baeldung.com/spring-6-http-interface)
- [Getting the Current ApplicationContext in Spring](https://www.baeldung.com/spring-get-current-applicationcontext) - [Getting the Current ApplicationContext in Spring](https://www.baeldung.com/spring-get-current-applicationcontext)
- More articles: [[<-- prev]](../spring-core-5)

View File

@ -21,20 +21,6 @@
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId> <artifactId>spring-boot-starter-web</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.mock-server</groupId>
<artifactId>mockserver-netty</artifactId>
<version>${mockserver.version}</version>
</dependency>
<dependency>
<groupId>org.mock-server</groupId>
<artifactId>mockserver-client-java</artifactId>
<version>${mockserver.version}</version>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId> <artifactId>spring-boot-starter-test</artifactId>
@ -104,7 +90,6 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>17</maven.compiler.source> <maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target> <maven.compiler.target>17</maven.compiler.target>
<mockserver.version>5.14.0</mockserver.version>
</properties> </properties>
</project> </project>

View File

@ -1,5 +1 @@
environment.name=${OS}
java.home.and.environment=${JAVA_HOME}+${OS}
not.existing.system.property=${thispropertydoesnotexist}
baeldung.presentation=${HELLO_BAELDUNG}. Java is installed in the folder: ${JAVA_HOME}
config.file.path=./spring-core-6/src/main/resources/config.properties config.file.path=./spring-core-6/src/main/resources/config.properties

View File

@ -1,217 +0,0 @@
package com.baeldung.httpinterface;
import org.apache.http.HttpException;
import org.apache.http.HttpStatus;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.mockserver.client.MockServerClient;
import org.mockserver.integration.ClientAndServer;
import org.mockserver.configuration.Configuration;
import java.io.IOException;
import java.net.ServerSocket;
import java.util.List;
import org.mockserver.model.HttpRequest;
import org.mockserver.model.MediaType;
import org.mockserver.verify.VerificationTimes;
import org.slf4j.event.Level;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatusCode;
import org.springframework.http.ResponseEntity;
import org.springframework.web.reactive.function.client.WebClient;
import org.springframework.web.reactive.function.client.WebClientResponseException;
import reactor.core.publisher.Mono;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockserver.integration.ClientAndServer.startClientAndServer;
import static org.mockserver.matchers.Times.exactly;
import static org.mockserver.model.HttpRequest.request;
import static org.mockserver.model.HttpResponse.response;
import static org.junit.jupiter.api.Assertions.assertEquals;
class BooksServiceMockServerTest {
private static final String SERVER_ADDRESS = "localhost";
private static final String PATH = "/books";
private static int serverPort;
private static ClientAndServer mockServer;
private static String serviceUrl;
@BeforeAll
static void startServer() throws IOException {
serverPort = getFreePort();
serviceUrl = "http://" + SERVER_ADDRESS + ":" + serverPort;
Configuration config = Configuration.configuration().logLevel(Level.WARN);
mockServer = startClientAndServer(config, serverPort);
mockAllBooksRequest();
mockBookByIdRequest();
mockSaveBookRequest();
mockDeleteBookRequest();
}
@AfterAll
static void stopServer() {
mockServer.stop();
}
@Test
void givenMockedGetResponse_whenGetBooksServiceMethodIsCalled_thenTwoBooksAreReturned() {
BooksClient booksClient = new BooksClient(WebClient.builder().baseUrl(serviceUrl).build());
BooksService booksService = booksClient.getBooksService();
List<Book> books = booksService.getBooks();
assertEquals(2, books.size());
mockServer.verify(
HttpRequest.request()
.withMethod(HttpMethod.GET.name())
.withPath(PATH),
VerificationTimes.exactly(1)
);
}
@Test
void givenMockedGetResponse_whenGetExistingBookServiceMethodIsCalled_thenCorrectBookIsReturned() {
BooksClient booksClient = new BooksClient(WebClient.builder().baseUrl(serviceUrl).build());
BooksService booksService = booksClient.getBooksService();
Book book = booksService.getBook(1);
assertEquals("Book_1", book.title());
mockServer.verify(
HttpRequest.request()
.withMethod(HttpMethod.GET.name())
.withPath(PATH + "/1"),
VerificationTimes.exactly(1)
);
}
@Test
void givenMockedGetResponse_whenGetNonExistingBookServiceMethodIsCalled_thenCorrectBookIsReturned() {
BooksClient booksClient = new BooksClient(WebClient.builder().baseUrl(serviceUrl).build());
BooksService booksService = booksClient.getBooksService();
assertThrows(WebClientResponseException.class, () -> booksService.getBook(9));
}
@Test
void givenCustomErrorHandlerIsSet_whenGetNonExistingBookServiceMethodIsCalled_thenCustomExceptionIsThrown() {
BooksClient booksClient = new BooksClient(WebClient.builder()
.defaultStatusHandler(HttpStatusCode::isError, resp ->
Mono.just(new MyServiceException("Custom exception")))
.baseUrl(serviceUrl)
.build());
BooksService booksService = booksClient.getBooksService();
assertThrows(MyServiceException.class, () -> booksService.getBook(9));
}
@Test
void givenMockedPostResponse_whenSaveBookServiceMethodIsCalled_thenCorrectBookIsReturned() {
BooksClient booksClient = new BooksClient(WebClient.builder().baseUrl(serviceUrl).build());
BooksService booksService = booksClient.getBooksService();
Book book = booksService.saveBook(new Book(3, "Book_3", "Author_3", 2000));
assertEquals("Book_3", book.title());
mockServer.verify(
HttpRequest.request()
.withMethod(HttpMethod.POST.name())
.withPath(PATH),
VerificationTimes.exactly(1)
);
}
@Test
void givenMockedDeleteResponse_whenDeleteBookServiceMethodIsCalled_thenCorrectCodeIsReturned() {
BooksClient booksClient = new BooksClient(WebClient.builder().baseUrl(serviceUrl).build());
BooksService booksService = booksClient.getBooksService();
ResponseEntity<Void> response = booksService.deleteBook(3);
assertEquals(HttpStatusCode.valueOf(200), response.getStatusCode());
mockServer.verify(
HttpRequest.request()
.withMethod(HttpMethod.DELETE.name())
.withPath(PATH + "/3"),
VerificationTimes.exactly(1)
);
}
private static int getFreePort () throws IOException {
try (ServerSocket serverSocket = new ServerSocket(0)) {
return serverSocket.getLocalPort();
}
}
private static void mockAllBooksRequest() {
new MockServerClient(SERVER_ADDRESS, serverPort)
.when(
request()
.withPath(PATH)
.withMethod(HttpMethod.GET.name()),
exactly(1)
)
.respond(
response()
.withStatusCode(HttpStatus.SC_OK)
.withContentType(MediaType.APPLICATION_JSON)
.withBody("[{\"id\":1,\"title\":\"Book_1\",\"author\":\"Author_1\",\"year\":1998},{\"id\":2,\"title\":\"Book_2\",\"author\":\"Author_2\",\"year\":1999}]")
);
}
private static void mockBookByIdRequest() {
new MockServerClient(SERVER_ADDRESS, serverPort)
.when(
request()
.withPath(PATH + "/1")
.withMethod(HttpMethod.GET.name()),
exactly(1)
)
.respond(
response()
.withStatusCode(HttpStatus.SC_OK)
.withContentType(MediaType.APPLICATION_JSON)
.withBody("{\"id\":1,\"title\":\"Book_1\",\"author\":\"Author_1\",\"year\":1998}")
);
}
private static void mockSaveBookRequest() {
new MockServerClient(SERVER_ADDRESS, serverPort)
.when(
request()
.withPath(PATH)
.withMethod(HttpMethod.POST.name())
.withContentType(MediaType.APPLICATION_JSON)
.withBody("{\"id\":3,\"title\":\"Book_3\",\"author\":\"Author_3\",\"year\":2000}"),
exactly(1)
)
.respond(
response()
.withStatusCode(HttpStatus.SC_OK)
.withContentType(MediaType.APPLICATION_JSON)
.withBody("{\"id\":3,\"title\":\"Book_3\",\"author\":\"Author_3\",\"year\":2000}")
);
}
private static void mockDeleteBookRequest() {
new MockServerClient(SERVER_ADDRESS, serverPort)
.when(
request()
.withPath(PATH + "/3")
.withMethod(HttpMethod.DELETE.name()),
exactly(1)
)
.respond(
response()
.withStatusCode(HttpStatus.SC_OK)
);
}
}

View File

@ -1,88 +0,0 @@
package com.baeldung.httpinterface;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Answers;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatusCode;
import org.springframework.http.ResponseEntity;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;
import static org.mockito.BDDMockito.*;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals;
@ExtendWith(MockitoExtension.class)
class BooksServiceMockitoTest {
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private WebClient webClient;
@InjectMocks
private BooksClient booksClient;
@Test
void givenMockedWebClientReturnsTwoBooks_whenGetBooksServiceMethodIsCalled_thenListOfTwoBooksIsReturned() {
given(webClient.method(HttpMethod.GET)
.uri(anyString(), anyMap())
.retrieve()
.bodyToMono(new ParameterizedTypeReference<List<Book>>(){}))
.willReturn(Mono.just(List.of(
new Book(1,"Book_1", "Author_1", 1998),
new Book(2, "Book_2", "Author_2", 1999)
)));
BooksService booksService = booksClient.getBooksService();
List<Book> books = booksService.getBooks();
assertEquals(2, books.size());
}
@Test
void givenMockedWebClientReturnsBook_whenGetBookServiceMethodIsCalled_thenBookIsReturned() {
given(webClient.method(HttpMethod.GET)
.uri(anyString(), anyMap())
.retrieve()
.bodyToMono(new ParameterizedTypeReference<Book>(){}))
.willReturn(Mono.just(new Book(1,"Book_1", "Author_1", 1998)));
BooksService booksService = booksClient.getBooksService();
Book book = booksService.getBook(1);
assertEquals("Book_1", book.title());
}
@Test
void givenMockedWebClientReturnsBook_whenSaveBookServiceMethodIsCalled_thenBookIsReturned() {
given(webClient.method(HttpMethod.POST)
.uri(anyString(), anyMap())
.retrieve()
.bodyToMono(new ParameterizedTypeReference<Book>(){}))
.willReturn(Mono.just(new Book(3, "Book_3", "Author_3", 2000)));
BooksService booksService = booksClient.getBooksService();
Book book = booksService.saveBook(new Book(3, "Book_3", "Author_3", 2000));
assertEquals("Book_3", book.title());
}
@Test
void givenMockedWebClientReturnsOk_whenDeleteBookServiceMethodIsCalled_thenOkCodeIsReturned() {
given(webClient.method(HttpMethod.DELETE)
.uri(anyString(), anyMap())
.retrieve()
.toBodilessEntity()
.block(any())
.getStatusCode())
.willReturn(HttpStatusCode.valueOf(200));
BooksService booksService = booksClient.getBooksService();
ResponseEntity<Void> response = booksService.deleteBook(3);
assertEquals(HttpStatusCode.valueOf(200), response.getStatusCode());
}
}