Spring Boot 提供与三个 JSON 映射库的集成:
Jackson 是首选的默认库。
提供了 Jackson 的自动配置,并且 Jackson 是spring-boot-starter-json
. 当 Jackson 在类路径上时,ObjectMapper
会自动配置一个 bean。提供了几个配置属性用于自定义ObjectMapper
.
提供了 Gson 的自动配置。当 Gson 在类路径上时,Gson
会自动配置一个 bean。提供了几个spring.gson.*
配置属性用于自定义配置。
在上下文中没有Executor
bean 的情况下,Spring Boot 自动配置一个ThreadPoolTaskExecutor
合理的默认值,这些默认值可以自动关联到异步任务执行 ( @EnableAsync
) 和 Spring MVC 异步请求处理。
线程池使用8个核心线程,可以根据负载增长和收缩。这些默认设置可以使用命名空间进行微调spring.task.execution
,如以下示例所示:
spring:
task:
execution:
pool:
max-size: 16
queue-capacity: 100
keep-alive: "10s"
这将线程池更改为使用有界队列,以便当队列已满(100 个任务)时,线程池增加到最多 16 个线程。由于线程在空闲 10 秒(而不是默认情况下为 60 秒)时被回收,因此池的收缩更具侵略性。
ThreadPoolTaskScheduler
如果需要与计划的任务执行相关联(@EnableScheduling
例如使用),也可以自动配置A。线程池默认使用一个线程,可以使用命名空间微调其设置spring.task.scheduling
,如下例所示:
spring:
task:
scheduling:
thread-name-prefix: "scheduling-"
pool:
size: 2
如果需要创建自定义执行程序或调度程序,则TaskExecutorBuilder
bean 和bean 在上下文中都可用。
Spring Boot 提供了许多实用程序和注释来帮助测试您的应用程序。测试支持由两个模块提供:spring-boot-test
包含核心项目,并spring-boot-test-autoconfigure
支持测试的自动配置。
大多数开发人员使用spring-boot-starter-test
“Starter”,它导入 Spring Boot 测试模块以及 JUnit Jupiter、AssertJ、Hamcrest 和许多其他有用的库。
“ spring-boot-starter-test
Starter”(在 中test
scope
)包含以下提供的库:
我们通常发现这些通用库在编写测试时很有用。
依赖注入的主要优点之一是它应该使您的代码更容易进行单元测试。您可以使用new
运算符来实例化对象,甚至无需涉及 Spring。您还可以使用模拟对象而不是真正的依赖项。
通常,您需要超越单元测试并开始集成测试(使用 Spring ApplicationContext
)。能够执行集成测试而不需要部署您的应用程序或需要连接到其他基础设施是很有用的。
Spring 框架包括一个用于此类集成测试的专用测试模块。你可以直接声明一个依赖org.springframework:spring-test
或者使用spring-boot-starter-test
“Starter”来传递它。
Spring Boot 应用程序是 Spring ApplicationContext
,因此除了您通常使用普通 Spring 上下文执行的操作之外,无需进行任何特别的测试即可对其进行测试。
Spring Boot 提供了注解,当您需要 Spring Boot 特性时@SpringBootTest
,可以将其用作标准注解的替代方案。
您可以使用@RestClientTest
注释来测试 REST 客户端。默认情况下,它会自动配置 Jackson、GSON 和 Jsonb 支持,配置 RestTemplateBuilder
并添加对MockRestServiceServer
. 使用注解 时不会扫描常规@Component
和bean。可用于包含bean。
您要测试的特定 bean 应使用 的value
orcomponents
属性指定@RestClientTest
,如以下示例所示:
@RestClientTest(RemoteVehicleDetailsService.class)
class MyRestClientTests {
@Autowired
private RemoteVehicleDetailsService service;
@Autowired
private MockRestServiceServer server;
@Test
void getVehicleDetailsWhenResultIsSuccessShouldReturnDetails() throws Exception {
this.server.expect(requestTo("/greet/details")).andRespond(withSuccess("hello", MediaType.TEXT_PLAIN));
String greeting = this.service.callRestService();
assertThat(greeting).isEqualTo("hello");
}
}
测试应用程序时通常有用的一些测试实用程序类被打包为spring-boot
.
TestRestTemplate
是 Spring 的一种方便替代方案,RestTemplate
在集成测试中很有用。您可以获得一个普通模板或发送基本 HTTP 身份验证(带有用户名和密码)的模板。在任何一种情况下,模板都是容错的。这意味着它以一种测试友好的方式运行,不会在 4xx 和 5xx 错误上抛出异常。相反,可以通过返回ResponseEntity
的及其状态码检测此类错误。
TestRestTemplate
可以在集成测试中直接实例化,如下例所示:
class MyTests {
private TestRestTemplate template = new TestRestTemplate();
@Test
void testRequest() throws Exception {
ResponseEntity<String> headers = this.template.getForEntity("https://myhost.example.com/example", String.class);
assertThat(headers.getHeaders().getLocation()).hasHost("other.example.com");
}
}
或者,如果您将@SpringBootTest
注释与WebEnvironment.RANDOM_PORT
一起使用WebEnvironment.DEFINED_PORT
,您可以注入一个完全配置的TestRestTemplate
并开始使用它。如有必要,可以通过RestTemplateBuilder
bean 应用额外的定制。任何未指定主机和端口的 URL 都会自动连接到嵌入式服务器,如下例所示:
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
class MySpringBootTests {
@Autowired
private TestRestTemplate template;
@Test
void testRequest() {
HttpHeaders headers = this.template.getForEntity("/example", String.class).getHeaders();
assertThat(headers.getLocation()).hasHost("other.example.com");
}
@TestConfiguration(proxyBeanMethods = false)
static class RestTemplateBuilderConfiguration {
@Bean
RestTemplateBuilder restTemplateBuilder() {
return new RestTemplateBuilder().setConnectTimeout(Duration.ofSeconds(1))
.setReadTimeout(Duration.ofSeconds(1));
}
}
}