哈尔滨网站建设方案,贸易网站开发,站点建立网站的方法,个人网站如何建立Spring Boot 提供了丰富的测试功能#xff0c;主要由以下两个模块组成#xff1a;
spring-boot-test#xff1a;提供测试核心功能。spring-boot-test-autoconfigure#xff1a;提供对测试的自动配置。
Spring Boot 提供了一个 spring-boot-starter-test一站式启动器…Spring Boot 提供了丰富的测试功能主要由以下两个模块组成
spring-boot-test提供测试核心功能。spring-boot-test-autoconfigure提供对测试的自动配置。
Spring Boot 提供了一个 spring-boot-starter-test一站式启动器如以下依赖配置所示。
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope
/dependency测试启动器依赖不仅包含以上两个 Spring Boot模块还包含 Spring Test 测试模块以及其他
第三方测试类库如下所示。
JUnit 5Java 最主流的单元测试框架。AssertJ一款快速断言库。Hamcrest一款单元测试匹配库。Mockito一款 Mock 测试框架。JSONassert一款 JSON 断言库。JsonPath一款 JSON XPath 库。
更多测试相关的依赖可见具体的依赖关系树如下图所示。
以上这些都是 Spring Boot 提供的常用的测试类库如果上面的测试类库还不能满足你的需要也可以任意添加以上没有的类库。
现在基本上使用的是 JUnit 5如果应用还在使用JUnit 4 写的单元测试用例那么也可以使用JUnit 5 的 Vintage 引擎来运行如下面的依赖配置所示。
dependencygroupIdorg.junit.vintage/groupIdartifactIdjunit-vintage-engine/artifactIdscopetest/scopeexclusionsexclusiongroupIdorg.hamcrest/groupIdartifactIdhamcrest-core/artifactId/exclusion/exclusions
/dependency需要排除 hamcrest-core 依赖因为该依赖已经改坐标了并且默认内置在Spring Boot依赖管理中如上面的依赖关系树所示最新的 Hamcrest依赖已经是org.hamcrest:hamcrest坐标了。
Spring Boot提供了一个 SpringBootTest 注解用在单元测试类上以启用支持Spring Boot特性的单元测试如果使用的是JUnit 4那么测试类上还需要额外的RunWith(SpringRunner. class)注解然后在测试类方法上添加 Test 注解即可每一个 Test 注解修饰的方法就是一个单元测试方法。
SpringBootTest 注解有一个最重要的 webEnvironment 环境参数支持以下几种环境设置
MOCK默认 加载一个 Web ApplicationContext 并提供一个 Mock Web Environment但不会启动内嵌的 Web 服务器并可以结合 AutoConfifigureMockMvcor 和 AutoConfifigure-WebTestClient 注解一起使用进行 Mock 测试。RANDOM_PORT 加载一个 WebServerApplicationContext以及提供一个真实的 WebEnvironment并以随机端口启动内嵌服务器。DEFINED_PORT 和 RANDOM_PORT 一样不同的是 DEFINED_PORT 是以应用指定的端口运行的默认端口为 8080。NONE 加载一个 ApplicationContext但不会提供任何 Web Environment。 如果使用的 SpringBootTest 注解不带任何参数则默认为 Mock 环境。
真实环境测试
在 SpringBootTest 注解中指定基于随机端口的真实Web环境然后在类成员变量或者方法参数上注入 TestRestTemplate 实例就可以完成对 Spring MVC接口的真实环境测试。
下面是一个基于随机端口的真实环境的测试用例
SpringBootTest(webEnvironment SpringBootTest.WebEnvironment.RANDOM_PORT)
public class MvcTest {Testpublic void getUserTest(Autowired TestRestTemplate testRestTemplate) {MapString, String multiValueMap new HashMap();multiValueMap.put(username, Java 技术栈 );Result result testRestTemplate.getForObject(/user/get?username{username},Result.class, multiValueMap);assertThat(result.getCode()).isEqualTo(0);assertThat(result.getMsg()).isEqualTo(ok);}}测试当前应用下的 /user/get 接口传入对应的用户名参数最后检查接口返回结果是否和预期一致测试结果如下图所示。 单元测试通过从执行日志可以看到它启动了一个嵌入式的 Tomcat 容器来测试真实的 Web应用环境。
Mock 环境测试
通过在类上面使用 AutoConfifigureMockMvc 注解然后在类成员变量或者方法参数上注入MockMvc 实例就可以完成对 Spring MVC 接口的 Mock 测试。
下面是一个基于默认 Mock 环境的测试用例
SpringBootTest
AutoConfigureMockMvc
class MockMvcTests {Testpublic void getUserTest(Autowired MockMvc mvc) throws Exception {mvc.perform(MockMvcRequestBuilders.get(/user/get?username{username}, test)).andExpect(status().isOk()).andExpect(content().string({\code\:0,\msg\:\ok\,\
data\:\test\}));}
}测试当前应用下的 /user/get 接口传入对应的用户名参数最后检查请求状态是否OK200响应的内容是否和预期一致测试结果如下图所示。
单元测试通过从执行日志可以看到它并未启动真实的 Web 环境来测试而是使用 Mock 环境测试的。
Mock 组件测试
某些时候可能还需要模拟一些组件比如某些服务只有上线之后才能调用在开发阶段不可用这时就需要 Mock 模拟测试了提供各种模拟组件以完成测试。
Spring Boot 提供了一个 MockBean 注解可为 Spring 中的 Bean 组件定义基于 Mockito 的Mock 测试它可以创建一个新 Bean 以覆盖 Spring 环境中已有的 Bean它可以用在测试类、成员变量上或者 Confifiguration 配置类、成员变量上被模拟的 Bean 在每次测试结束后自动重置。
假现现在有一个远程的服务 userService本地不能调用现在进行 Mock 测试如以下使用示例所示。
SpringBootTest
class MockBeanTests {
// Autowired
// private UserService userService;MockBeanprivate UserService userService;Testpublic void countAllUsers() {BDDMockito.given(this.userService.countAllUsers()).willReturn(88);assertThat(this.userService.countAllUsers()).isEqualTo(88);}
}这里的 MockBean 注解使用在 UserService 变量上表明这个userService实例在当前测试用例中是被 Mock 覆盖的如果要模拟的 Bean 有多个则可以使用Qualififier注解指定然后通过Mockito 提供的代理工具类方法创建模拟返回数据运行该服务的测试方法当模拟数据和预期结果一致时才会测试通过。
这里通过 BDDMockito 工具类模拟 userService#countAllUsers方法并让它返回统计的用户总数88最后检查该方法的返回值是否和预期一致测试结果如下图所示。 单元测试通过也可以使用 SpyBean 注解代替 MockBean 注解两者的区别是
SpyBean—如果没有提供 Mockito 代理方法则会调用真实的 Bean 来获取数据。MockBean—不管有没有提供 Mockito 代理方法都会调用 Mock 的 Bean 来获取数据。 MockBean、SpyBean 注解既可作用于 Mock 环境也可作用于真实环境它只是用来模拟、替换环境中指定的 Bean 而已但不能用于模拟在应用上下文刷新期间 Bean 的行为因为在执行测试用例时应用上下文已经刷新完成了所以不可能再去模拟了这种情况下建议使用 Bean 方法来创建模拟配置。