springboottest版本号_SpringBootTest 测试工具

以下内容,翻译自官方文档,并结合了学习过程的demo。Spring Boot提供了许多实用程序和注解,帮助测试应用程序。测试支持由两个模块提供:spring-boot-test 包含核心项,spring-boot-test-autoconfigure 支持测试的自动配置。大多数开发人员使用 spring-boot-starter-test,它同时导入 SpringBoot 测试模块以及JUnit ...
摘要由CSDN通过智能技术生成

以下内容,翻译自官方文档,并结合了学习过程的demo。

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

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

此文使用当前最新稳定版本: SpringBoot 2.2.2.RELEASE

此 starter 还带来了 vintage  引擎,因此可以同时运行JUnit 4和JUnit 5测试。如果已经将测试迁移到JUnit5,那么应该排除JUnit4支持,如下例所示:

org.springframework.boot

spring-boot-starter-test

org.junit.vintage

junit-vintage-engine

test

Test Scope Dependencies

spring-boot-starter-test (依赖 scope 为 test)包含以下库:

JUnit 5:包含兼容 JUnit 4,Java 应用程序单元测试的事实标准

Spring Test 和 SpringBootTest:对Spring Boot应用程序的公共和集成测试支持。

Mockito:Java 模拟框架

JsonPath:JSON XPath

测试 Spring 应用

依赖注入的一个主要优点是它应该使代码更容易进行单元测试。可以使用新的操作符实例化对象,甚至不涉及Spring。也可以使用模拟对象而不是实际依赖项。

通常,您需要超越单元测试,开始集成测试(使用Spring ApplicationContext)。能够在不需要部署应用程序或连接到其他基础结构的情况下执行集成测试是非常有用的。

Spring框架包含了一个专门的集成测试模块。可以直接向 org.springframework:spring 测试声明一个依赖项,或者使用 spring-boot-starter-test 。

如果以前没有使用过 spring-test 模块,那么应该从阅读spring框架参考文档的相关部分开始。

测试 SpringBoot 应用

SpringBoot 应用程序是 Spring ApplicationContext,因此除了使用普通的Spring上下文之外,不必做任何特别的事情来测试它。

默认情况下,只有在使用 SpringApplication 创建 Spring Boot时,它的外部属性、日志记录和其他特性才会安装在上下文中。

SpringBoot 提供了一个 @SpringBootTest 注解,当需要SpringBoot 特性时,它可以作为标准 spring-test @ContextConfiguration 注解的替代。注解的工作方式是通过 SpringApplication 创建测试中使用的ApplicationContext。除了 @SpringBootTest之外,还提供了一些其他注解,用于测试应用程序的更具体的部分。

如果使用的是JUnit4,不要忘记将 @RunWith(SpringRunner.class) 添加到测试中,否则注解将被忽略。如果使用的是JUnit5,则不需要添加与 @SpringBootTest 和 其他已经使用的注解等效的 @ExtendWith(SpringExtension.class)

默认情况下,@SpringBootTest 不会启动服务器。可以使用 @SpringBootTest 的 webEnvironment 属性进一步优化测试的运行方式:

MOCK(默认):加载 web ApplicationContext 并提供模拟web环境。使用此注解时,嵌入式服务器未启动。如果类路径上没有可用的web环境,则此模式会透明地回退到创建常规的非web ApplicationContext。它可以与 @AutoConfigureMockMvc 或 @AutoConfigureWebTestClient 结合使用,对web应用程序进行基于模拟的测试。

RANDOM_PORT:加载 WebServerApplicationContext 并提供真正的web环境。嵌入式服务器启动并在随机端口上监听。

DEFINED_PORT:加载 WebServerApplicationContext 并提供真正的web环境。嵌入式服务器将启动并在定义的端口(从 application.properties)或默认端口8080上监听。

NONE:使用 SpringApplication 加载 ApplicationContext,但不提供任何web环境(mock或其他)。

如果测试是 @Transactional,那么默认情况下,它会在每个测试方法结束时回滚事务。然而,由于对随机端口或定义的端口使用这种安排隐式地提供了一个真正的servlet环境,HTTP客户机和服务器在单独的线程中运行,因此在单独的事务中运行。在这种情况下,服务器上启动的任何事务都不会回滚。

@使用 webEnvironment=webEnvironment.RANDOM_PORT 的 @SpringBootTest 也将在单独的随机端口上启动管理服务器,如果应用程序对管理服务器使用不同的端口。

检测 Web 应用类型

如果 Spring MVC 可用,那么将配置一个常规的基于MVC的应用程序上下文。如果只有Spring WebFlux,将检测并配置基于 WebFlux 的应用程序上下文。

如果两者都存在,则以Spring MVC为准。如果要在此方案中测试响应式web应用程序,则必须设置 spring.main.web-application-type 属性:

@SpringBootTest(properties = "spring.main.web-application-type=reactive")

class MyWebFluxTests { ... }

检测测试配置

Spring 测试框架中,可以使用 @ContextConfiguration(classes=…) 来指定加载那个 Spring @Configuration。

在测试 Spring Boot 应用程序时,这通常不是必需的。Spring Boot的 @Test 类注解在没有显式定义主配置时自动搜索主配置。

搜索算法从包含测试的包开始工作,直到找到用 @SpringBootApplication 或 @SpringBootConfiguration 注解的类为止。只要以合理的方式构造代码,通常都会找到主配置。

如果要自定义主配置,可以使用嵌套的 @TestConfiguration 类。与嵌套的 @Configuration 类(将用于替代应用程序的主配置)不同,嵌套的 @TestConfiguration 类是在应用程序的主配置额外使用的。

Spring的测试框架在测试之间缓存应用程序上下文。因此,只要您的测试共享相同的配置(无论如何发现),加载上下文的潜在耗时过程只发生一次。

排除测试配置

如果使用了 @SpringBootApplication 或 @ComponentScan 扫描,针对特定测试的顶级配置类可能在任何地方都能够被获取到。

如前所述,@TestConfiguration 可用于测试的内部类,以自定义主要配置。当放置在顶级类上时,@TestConfiguration 表示 src/test/java 中的类不应该通过扫描来获取。然后,可以在需要时显式导入该类,如下例所示:

@SpringBootTest

@Import(MyTestsConfiguration.class)

class MyTests {

@Test

void exampleTest() {

//...

}

}

使用应用参数

如果应用程序需要参数,可以使用 @SpringBootTest 的 args 属性注入它们。

@SpringBootTest(args = "--app.name=test", webEnvironment = WebEnvironment.NONE)

public class ArgTests {

@Test

public void applicationArgsTest(@Autowired ApplicationArguments args) {

assertThat(args.getOptionNames()).containsOnly("app.name");

assertThat(args.getOptionValues("app.name")).containsOnly("test");

}

}

用 mock environment测试

默认情况下,@SpringBootTest 不会启动服务器。如果在此模拟环境中有要测试的web端点,则可以另外配置MockMvc,如下例所示:

org.springframework.boot

spring-boot-starter-web

public interface ConstantUtil {

String body = "Hello World!";

}

@RestController

public class HelloWorldController {

@RequestMapping

public String helloWorld(){

return ConstantUtil.body;

}

}

@SpringBootTest

@AutoConfigureMockMvc

public class MockMvcTests {

@Test

public void test(@Autowired MockMvc mvc) throws Exception {

mvc.perform(get("/")).andExpect(status().isOk()).andExpect(content().string(ConstantUtil.body));

}

}

如果您只想关注web层而不想启动一个完整的 ApplicationContext,可以考虑改用 @WebMvcTest。

另外,可以配置 WebTestClient ,如下:

org.springframework.boot

spring-boot-starter-webflux

/**

* WebTestClient

* WebTestClient 属于 reactive,设置spring.main.web-application-type=reactive

*/

@SpringBootTest(properties = "spring.main.web-application-type=reactive")

@AutoConfigureWebTestClient

public class MockWebTestClientTests {

@Test

public void test(@Autowired WebTestClient webTestClient) {

webTestClient

.get()

.uri("/")

.exchange()

.expectStatus()

.isOk()

.expectBody(String.class)

.isEqualTo(ConstantUtil.body);

}

}

在模拟环境中进行测试通常比使用完整的Servlet容器运行要快。但是,由于模拟发生在Spring MVC层,依赖于低级Servlet容器行为的代码不能直接用MockMvc测试。

例如,Spring Boot的错误处理基于Servlet容器提供的“错误页”支持。这意味着,虽然可以按预期测试MVC层抛出和处理异常,但不能直接测试是否呈现了特定的自定义错误页。如果需要测试这些较低级别的关注点,可以按照下一节中的说明启动完全运行的服务器。

用运行中的server测试

如果需要启动完全运行的服务器,建议使用随机端口。如果使用 @SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT),则每次运行测试时都会随机选择一个可用端口。

@LocalServerPort 注解可用于将实际使用的端口注入测试。为了方便起见,需要对启动的服务器进行REST调用的测试还可以 @Autowire 一个 WebTestClient,它解析到正在运行的服务器的相关链接,并附带用于验证响应的专用API,如下例所示:

<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值