springboot2.6.2系列教程之JSON&任务执行与调度&测试-7

目录

    • JSON
      • Jackson
      • Gson
    • 任务执行与调度
    • 测试
      • 测试范围依赖
      • 测试 Spring 应用程序
      • 测试 Spring Boot 应用程序
        • 自动配置的 REST 客户端
      • 测试工具

JSON

Spring Boot 提供与三个 JSON 映射库的集成:

  • Gson
  • Jackson
  • JSON-B

Jackson 是首选的默认库。

Jackson

提供了 Jackson 的自动配置,并且 Jackson 是spring-boot-starter-json. 当 Jackson 在类路径上时,ObjectMapper会自动配置一个 bean。提供了几个配置属性用于自定义ObjectMapper.

Gson

提供了 Gson 的自动配置。当 Gson 在类路径上时,Gson会自动配置一个 bean。提供了几个spring.gson.*配置属性用于自定义配置。

任务执行与调度

在上下文中没有Executorbean 的情况下,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

如果需要创建自定义执行程序或调度程序,则TaskExecutorBuilderbean 和bean 在上下文中都可用。

测试

Spring Boot 提供了许多实用程序和注释来帮助测试您的应用程序。测试支持由两个模块提供:spring-boot-test包含核心项目,并spring-boot-test-autoconfigure支持测试的自动配置。

大多数开发人员使用spring-boot-starter-test“Starter”,它导入 Spring Boot 测试模块以及 JUnit Jupiter、AssertJ、Hamcrest 和许多其他有用的库。

测试范围依赖

spring-boot-starter-testStarter”(在 中test scope)包含以下提供的库:

  • JUnit 5:单元测试 Java 应用程序的事实标准。
  • Spring Test & Spring Boot Test:Spring Boot 应用程序的实用程序和集成测试支持。
  • AssertJ:一个流畅的断言库。
  • Hamcrest:匹配器对象库(也称为约束或谓词)。
  • Mockito:Java 模拟框架。
  • JSONassert : JSON 的断言库。
  • JsonPath:JSON 的 XPath。

我们通常发现这些通用库在编写测试时很有用。

测试 Spring 应用程序

依赖注入的主要优点之一是它应该使您的代码更容易进行单元测试。您可以使用new运算符来实例化对象,甚至无需涉及 Spring。您还可以使用模拟对象而不是真正的依赖项。

通常,您需要超越单元测试并开始集成测试(使用 Spring ApplicationContext)。能够执行集成测试而不需要部署您的应用程序或需要连接到其他基础设施是很有用的。

Spring 框架包括一个用于此类集成测试的专用测试模块。你可以直接声明一个依赖org.springframework:spring-test或者使用spring-boot-starter-test“Starter”来传递它。

测试 Spring Boot 应用程序

Spring Boot 应用程序是 Spring ApplicationContext,因此除了您通常使用普通 Spring 上下文执行的操作之外,无需进行任何特别的测试即可对其进行测试。

Spring Boot 提供了注解,当您需要 Spring Boot 特性时@SpringBootTest,可以将其用作标准注解的替代方案。

自动配置的 REST 客户端

您可以使用@RestClientTest注释来测试 REST 客户端。默认情况下,它会自动配置 Jackson、GSON 和 Jsonb 支持,配置 RestTemplateBuilder并添加对MockRestServiceServer. 使用注解 时不会扫描常规@Component和bean。可用于包含bean。

您要测试的特定 bean 应使用 的valueorcomponents属性指定@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并开始使用它。如有必要,可以通过RestTemplateBuilderbean 应用额外的定制。任何未指定主机和端口的 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));
        }

    }

}

你可能感兴趣的:(springboot,json,spring,java)