说一说 SpringBoot 整合 Junit5 常用注解

简介: 我是小假 期待与你的下一次相遇 ~

@Test

在Springboot2.0版本之后,Junit就是5.几的版本,在方法上添加@Test即可

  1. @Test
  2. void fun1(){
  3.    int res = 1+1;
  4.    Assertions.assertEquals(2,res);
  5.    System.out.println(123);
  6. }

@BeforeEach & @AfterEach

每执行一个@Test就会执行一次

  1. @BeforeEach
  2. void before(){
  3.    System.out.println("before");
  4. }
  5. @AfterEach
  6. void after(){
  7.    System.out.println("after");
  8. }
  9. @Test
  10. void fun1(){
  11.    int res = 1+1;
  12.    Assertions.assertEquals(2,res);
  13.    System.out.println(123);
  14. }
  15. @Test
  16. void fun2(){
  17.    System.out.println(456);
  18. }

@BeforeAll & @AfterAll

无论有多少个@Test都只执行一次,且@BeforeAll & AfterAll下的方法必须是静态方法

  1. @BeforeAll
  2. static void init(){
  3.    System.out.println("init");
  4. }
  5. @AfterAll
  6. static void destory(){
  7.    System.out.println("destory");
  8. }
  9. @BeforeEach
  10. void before(){
  11.    System.out.println("before");
  12. }
  13. @AfterEach
  14. void after(){
  15.    System.out.println("after");
  16. }
  17. @Test
  18. void fun1(){
  19.    int res = 1+1;
  20.    Assertions.assertEquals(2,res);
  21.    System.out.println(123);
  22. }
  23. @Test
  24. void fun2(){
  25.    System.out.println(456);
  26. }

@SpringBootTest

在SpringBoot项目中,在测试类中new 一个类时,这个类可能同时会涉及到其他的Bean,而原来的@Test并不会涉及到SpringBoot的上下文,所以在SpringBoot项目中编写测试类时,会在类上添加@SpringBootTest,在创建项目选择 Spring Initializr创建SpringBoot项目时,目录下会有一个Test文件,就会看到自动创建好的Test类上带有@SpringBootTest

同时也能配合@Autowired的注入

  1. @SpringBootTest  //能够初始化springboot的上下文,防止new Serv01 的对象同时依赖其他的Bean
  2. public class Test2 {
  3.    @Autowired
  4.    Serv01 serv01;
  5.    @Test
  6.    void t1(){
  7.        int add = serv01.add(1, 1);
  8.        Assertions.assertEquals(2,add);
  9.        System.out.println(11);
  10.    }
  11. }

当然,运行这个带@SpringBootTest的测试用例,也会启动SpringBoot项目

@MockBean

通过mock来做到一个模拟,假如测试需要写入数据库,可能会造成一些不可挽回的操作,对这些危险的操作会使用mock来进行一个模拟

看下面的代码

  1. @SpringBootTest  //能够初始化springboot的上下文,防止new Serv01 的对象同时依赖其他的Bean
  2. public class Test2 {
  3.    @MockBean
  4.    Serv01 serv01;
  5.    @Test
  6.    void t1(){
  7.        int add = serv01.add(1, 1);
  8.        Assertions.assertEquals(2,add);
  9.        System.out.println(11);
  10.    }
  11. }

通过断点得知 变量add 等于0

原因就是在SpringBoot上下文的serv01的这个bean已经被mock替换掉了,因为mock并没有任何指定操作,所以int变量add 只会有默认值 0

对mock添加一些指定操作

  1. @SpringBootTest
  2. public class Test2 {
  3.    @MockBean
  4.    Serv01 serv01;
  5.    @Test
  6.    void t1(){
  7.        when(serv01.add(1,1)).thenReturn(3);
  8.        int add = serv01.add(1, 1);
  9.        Assertions.assertEquals(2,add);
  10.        System.out.println(11);
  11.    }
  12. }

再次修改代码,在Serv01添加sub的方法,然后运行测试,可以发现在指定规则的add方法,得出的结果是3,而未指定规则的sub方式则默认int变量为0

如果想让sub按照原来的方式进行测试,不想被@MockBean影响,可以使用@SpyBean

@SpyBean

@SpyBean是介于@MockBean@Autowired之间,在配置了规则的方法就按配置规则的执行,没有配置的就按原来的方法执行测试。如果再创建一个serv02,让serv01调用serv02的方法,运行的结果还是一样吗?

  1. @Service
  2. public class Serv02 {
  3.    int add2(int a, int b){
  4.        return a+b;
  5.    }
  6. }
  7. @Service
  8. public class Serv01 {
  9.    @Autowired
  10.    Serv02 serv02;
  11.    public int add(int a,int b){
  12.        return serv02.add2(a,b);
  13.    }
  14.    public int sub(int a,int b){
  15.        return a-b;
  16.    }
  17. }
  18. @SpringBootTest  //能够初始化springboot的上下文,防止new Serv01 的对象同时依赖其他的Bean
  19. public class Test2 {
  20.    @SpyBean
  21.    Serv01 serv01;
  22.    @MockBean
  23.    Serv02 serv02;
  24.    @Test
  25.    void t1(){
  26.        when(serv01.add(1,1)).thenReturn(3);
  27.        int add = serv01.add(1, 1);
  28.        int sub = serv01.sub(2,1);
  29.        Assertions.assertEquals(3,add);
  30.        Assertions.assertEquals(1,sub);
  31.        System.out.println(11);
  32.    }
  33. }

可以看到运行成功,即使mock的是serv02,通过serv01调用的add方法调用serv02的add2方法,照样运行成功!


相关文章
|
9月前
|
XML 安全 Java
使用 Spring 的 @Aspect 和 @Pointcut 注解简化面向方面的编程 (AOP)
面向方面编程(AOP)通过分离横切关注点,如日志、安全和事务,提升代码模块化与可维护性。Spring 提供了对 AOP 的强大支持,核心注解 `@Aspect` 和 `@Pointcut` 使得定义切面与切入点变得简洁直观。`@Aspect` 标记切面类,集中处理通用逻辑;`@Pointcut` 则通过表达式定义通知的应用位置,提高代码可读性与复用性。二者结合,使开发者能清晰划分业务逻辑与辅助功能,简化维护并提升系统灵活性。Spring AOP 借助代理机制实现运行时织入,与 Spring 容器无缝集成,支持依赖注入与声明式配置,是构建清晰、高内聚应用的理想选择。
827 0
|
9月前
|
缓存 监控 Java
SpringBoot @Scheduled 注解详解
使用`@Scheduled`注解实现方法周期性执行,支持固定间隔、延迟或Cron表达式触发,基于Spring Task,适用于日志清理、数据同步等定时任务场景。需启用`@EnableScheduling`,注意线程阻塞与分布式重复问题,推荐结合`@Async`异步处理,提升任务调度效率。
1433 128
|
9月前
|
Java 测试技术 API
将 Spring 的 @Embedded 和 @Embeddable 注解与 JPA 结合使用的指南
Spring的@Embedded和@Embeddable注解简化了JPA中复杂对象的管理,允许将对象直接嵌入实体,减少冗余表与连接操作,提升数据库设计效率。本文详解其用法、优势及适用场景。
462 126
|
10月前
|
XML JSON Java
Spring框架中常见注解的使用规则与最佳实践
本文介绍了Spring框架中常见注解的使用规则与最佳实践,重点对比了URL参数与表单参数的区别,并详细说明了@RequestParam、@PathVariable、@RequestBody等注解的应用场景。同时通过表格和案例分析,帮助开发者正确选择参数绑定方式,避免常见误区,提升代码的可读性与安全性。
|
12月前
|
人工智能 Java 测试技术
Spring Boot 集成 JUnit 单元测试
本文介绍了在Spring Boot中使用JUnit 5进行单元测试的常用方法与技巧,包括添加依赖、编写测试类、使用@SpringBootTest参数、自动装配测试模块(如JSON、MVC、WebFlux、JDBC等),以及@MockBean和@SpyBean的应用。内容实用,适合Java开发者参考学习。
1274 0
|
9月前
|
Java 测试技术 数据库
使用Spring的@Retryable注解进行自动重试
在现代软件开发中,容错性和弹性至关重要。Spring框架提供的`@Retryable`注解为处理瞬时故障提供了一种声明式、可配置的重试机制,使开发者能够以简洁的方式增强应用的自我恢复能力。本文深入解析了`@Retryable`的使用方法及其参数配置,并结合`@Recover`实现失败回退策略,帮助构建更健壮、可靠的应用程序。
1044 1
使用Spring的@Retryable注解进行自动重试
|
8月前
|
Java 测试技术 数据库连接
【SpringBoot(四)】还不懂文件上传?JUnit使用?本文带你了解SpringBoot的文件上传、异常处理、组件注入等知识!并且带你领悟JUnit单元测试的使用!
Spring专栏第四章,本文带你上手 SpringBoot 的文件上传、异常处理、组件注入等功能 并且为你演示Junit5的基础上手体验
1151 3
|
8月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
753 2
|
9月前
|
XML Java 数据格式
常用SpringBoot注解汇总与用法说明
这些注解的使用和组合是Spring Boot快速开发和微服务实现的基础,通过它们,可以有效地指导Spring容器进行类发现、自动装配、配置、代理和管理等核心功能。开发者应当根据项目实际需求,运用这些注解来优化代码结构和服务逻辑。
605 12

热门文章

最新文章