Java知识点总结:想看的可以从这里进入
目录
2.13、测试
测试就是在开发过程中用来检测某一段代码的功能是否能正确执行,Spring Boot 项⽬创建时会默认单元测试框架 spring-boot-test,它Spring Test、JUnit等其他测试框架结合起来(JUnit 5、AssertJ、Hamcrest、Mockito、JSONassert、JsonPath、Spring Test和Spring Boot Test)。
在使用测试是可以直接通过启动器:spring-boot-starter-test得到测试的支持。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency>
在SpringBoot中提供了一些注解来帮助我们进行测试:
- @SpringBootTest:寻找一个主配置类(@SpringBootApplication),并使用它来启动Spring应用程序上下文。SpringBootTest加载完整的应用程序并注入所有可能的bean,因此需要一定时间。1. MOCK(默认值):加载web ApplicationContext并提供一个模拟web环境,嵌入式服务器不会启动,可以与@AutoConfigureMockMvc或@AutoConfigureWebTestClient一起使用,用于基于模拟的web应用程序测试。2. RANDOM_PORT:加载一个WebServerApplicationContext并提供一个真实的web环境。嵌入式服务器在一个随机端口上启动并监听。3. DEFINED_PORT:加载WebServerApplicationContext并提供一个真实的web环境。嵌入式服务器将启动并在一个已定义的端口(yml中)或默认端口8080上侦听。4. NONE:通过使用SpringApplication加载ApplicationContext,但不提供任何web环境(模拟或其他)。
- @Test:用在方法上进行测试实际的业务逻辑
- @AutoConfigureMockMvc:和SpringBootTest 一起使用,可以自动配置MockMvc,测试Controller
2.12.1、 Junit单元测试
1、测试
需要添加用于单元测试的启动器,该启动器会自动导入 junit 的相关依赖:
<!--单元测试--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
使用测试 可以对项目中的方法进行测试,看它的执行是否能达到我们的预期效果,对相应的类创建对应的测试类,在方法上添加注解 @Test,就能使测试方法如同 main方法一样可以直接运行,这样就能观察到该方法最终执行的效果。
我们可以使用 IDEA 对某个类直接生成单元测试类。
- 在相应的类中 按 ctrl+shitf+T快捷键
- 选择需要测试的方法,并生成测试的类(⽣成了单元测试的框架类,具体的业务代码要⾃⼰填充)
- 选择一个select 方法生成测试类
- 添加注解SpringBootTest注解(可以加载被管理的Bean),并编写业务逻辑
2、常用注解
- @SpringBootTest:是一个组合注解,内部含有 JUnit5中使用 的运行器注解 @ExtendWith
- @Test:用在方法上,表示该方法是一个测试用方法,使可以运行
- @DisplayName(“名称”):给测试类设置一个名称
- 增强处理1. @BeforeEach:前置方法,每个测试方法执行前都会执行2. @AfterEach:后置方法,在每个测试方法执行后都会执行3. @BeforeAll:表示在所有测试方法之前执行4. @AfterAll:表示在所有测试方法之后执行
@SpringBootTest@Slf4jclassJunitTest{@Testpublicvoidtest(){ log.info("测试1");}@Testpublicvoidtest2(){ log.info("测试2");}@Testpublicvoidtest3(){ log.info("测试3");}@BeforeEachpublicvoidBeforeEach(){ log.info("在每个方法执行前执行");}@AfterEachpublicvoidafterEach(){ log.info("在每个方法执行后执行");}@BeforeAllstaticvoidbeforeAll(){ log.info("在所有测试方法执行前执行");}@AfterAllstaticvoidafterAll(){ log.info("在所有测试方法执行后执行");}}
- @Disabled:用在测试方法前,单独执行该方法时可以运行,但是如果点击测试类运行测试类内所有方法时,则加上此注解的方法不会运行
- @Timeout(value =超时时间,unit = 超时时间单位):设置方法的执行时间,如果超时会出现异常。TimeUnit.DAYS:代表二十四小时的时间单位TimeUnit.HOURS:代表六十分钟的时间单位TimeUnit.MINUTES:代表六十秒的时间单位。TimeUnit.SECONDS:时间单位代表一秒TimeUnit.MILLISECONDS:表示千分之一秒的时间单位。TimeUnit.MICROSECONDS:表示千分之一毫秒的时间单位TimeUnit.NANOSECONDS:表示千分之一微秒的时间单位
- @RepeatedTest(次数) :该方法每次运行都会执行指定次数。需要去掉@Test注解
3、断言
其中类Assertions是支持在测试中断言条件的实用方法的集合,除非另有说明,否则失败的断言将抛出org.opentest4j.AssertionFailedError或其子类。所有 JUnit断言 都是 org.junit.jupiter.Assertions 类中的静态方法
1、assertTrue(boolean condition):判断给定的boolean是否为true
2、assertFalse(boolean condition):判断给定的boolean是否为false
3、assertNull(Object actual):判断 Object 是否为null
4、assertNotNull(Object actual):判断 Object 不是null
5、assertEquals(o1,o2):判断两个对象是否相等
6、assertArrayEquals([],[]):判断连个数组是否相等
2.12.2、MockMvc
Junit 无法测试Controller中的方法,因为它是一种网络请求,所有我们可以使用 MockMvc 对Controller方法 进行测试
MockMvc是由spring-test包提供,MockMvc实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,使请求的验证变得更加方便。
这里有两个注解:
- @WebMvcTest:使用此注解会禁用完全自动配置,仅仅配置MVC相关配置
- @AutoConfigureMockMvc:自动配置MockMvc
使用@AutoConfigureMockMvc+@SpringBootTest进行测试:
- 正常创建Controller
@Controller@RequestMapping("/testMockMvc")publicclassUserinfoController{@ResourceprivateUserinfoService userinfoService;@GetMapping("/getUserinfo")@ResponseBodypublicUserinfouserinfo(long id){return userinfoService.getById(id);}@GetMapping("/hello")publicStringhello(String name ,Model model){ model.addAttribute("user", name+"欢迎欢迎");return"hello";}}
- 编写测试类
@SpringBootTest@AutoConfigureMockMvcpublicclassUserControllerTest{@AutowiredprivateMockMvc mockMvc;/* * 1、mockMvc.perform执行一个请求。 * MockMvcRequestBuilders.get("XXX") get提交访问controller的一个接口。 * MockMvcRequestBuilders.post("XXX") post提交访问controller的一个接口。 * .param 传递的参数 * .accept(MediaType.TEXT_HTML_VALUE))接受的响应结果的文档类型 * .contentType 请求数据的文档类型 * .content() 可以传递JSON数据 * 2、.andExpect 添加执行完成后的断言。 * 3、.andDo 添加一个结果处理器,表示要对结果做点什么事情 * 比如此处使用MockMvcResultHandlers.print()输出整个响应结果信息。 * 7、.andReturn表示执行完成后返回相应的结果。 */@TestpublicvoidgetUserinfo()throwsException{MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/testMockMvc/getUserinfo").param("id","1").contentType(MediaType.APPLICATION_JSON)).andDo(print()).andExpect(status().isOk()).andReturn();}@Testpublicvoidhello()throwsException{MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get("/testMockMvc/hello").param("name","yu")).andDo(print()).andExpect(status().isOk()).andReturn();}}
- 测试页面跳转
- 测试返回数据
版权归原作者 辰 羽 所有, 如有侵权,请联系我们删除。