springboot test测试类_掌握 SpringBoot 这两个属性,测试类可以健步如飞!

news/2024/7/24 12:56:30 标签: springboot test测试类

作者:jwenjian

转自:juejin.im/post/5e709f25f265da570c754d8d

单元测试是项目开发中必不可少的一环,在 SpringBoot 的项目中,我们用 @SpringBootTest 注解来标注一个测试类,在测试类中注入这个接口的实现类之后对每个方法进行单独测试。 比如下面这个示例测试类:
@SpringBootTest  
public class HelloServiceTests {  

    @Autowired  
    private IHelloSerive helloService;  

    @Test  
    public void testHello() {  
        // ...  
    }  
}

但是随着项目的代码量越来越大,你会发现测试类的启动速度变得越来越慢,而大多数情况下只是为了测试一下某个实现类的某个方法而已,比如测试一个DAO类的persist方法。

实际上, @SpringBootTest 注解还提供了两个参数,好好利用这两个参数就可以让测试类的启动速度变得更快。

1.webEnvironment

这个属性决定了测试类要不要启动一个 web 环境,说白了就是要不要启动一个 Tomcat 容器,可选的值为:

  • MOCK, 启动一个模拟的 Servlet 环境,这是默认值

  • RANDOM_PORT,启动一个 Tomcat 容器,并监听一个随机的端口号

  • DEFINED_PORT,启动一个 Tomcat 容器,并监听配置文件中定义的端口(未定义则默认监听8080)

  • NONE,不启动 Tomcat 容器

如果你要测试的方法不需要用到 Tomcat 容器,比如:

  • 测试一个 DAO 类的增删改查

  • 测试一个 Service 类的业务方法

  • 测试一个 Util 类的公用方法

  • 测试一个配置文件类是否读取到了正确的值

  • … …

只需要通过指定 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE) 即可达到加速的效果。这时测试类启动时就只会初始化 Spring 上下文,不再启动 Tomcat 容器了:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)  
public class HelloServiceTests {  

    @Autowired  
    private IHelloSerive helloService;  

    @Test  
    public void testHello() {  
        // ...  
    }  
}
2. classes classes 属性用来指定运行测试类需要装载的 class 集合,如果不指定,那么会默认装载 @SpringBootConfiguration 注解标注的类。 提到 @SpringBootConfiguration 你可能比较陌生,其实 @SpringBootApplication 的源码里就引入了这个注解:
@Target({ElementType.TYPE})  
@Retention(RetentionPolicy.RUNTIME)  
@Documented  
@Inherited  
@SpringBootConfiguration  
@EnableAutoConfiguration  
@ComponentScan(  
    excludeFilters = {@Filter(  
    type = FilterType.CUSTOM,  
    classes = {TypeExcludeFilter.class}  
), @Filter(  
    type = FilterType.CUSTOM,  
    classes = {AutoConfigurationExcludeFilter.class}  
)}  
)  
public @interface SpringBootApplication {  
    // ...  
}

也就是说,如果我们不指定classes属性,那么启动测试类时需要加载的Bean的数量和正常启动一次入口类(即有@SpringBootApplication注解的类)加载的 Bean 数量是一样的。

如果你的项目中有很多个 Bean, 特别是有以下几种时:

  • 有 CommandLineRunner 的实现类

  • 用 @PostConstruct 注解指定了初始化方法的类

这几种类在程序初始化的过程中都会运行自身的业务代码或者初始化代码,从而延后了测试方法的运行。

在这种情况下,我们在编写测试类的时候,如果明确这个测试类会用到哪几个 Bean,则可以在 classes 属性处指定,之后启动测试类的时候,就只会加载需要的 Bean 到上下文中,从而加快启动速度。比如:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes={HelloServiceImpl.class})  
public class HelloServiceTests {  

    @Autowired  
    private IHelloService helloService;  

    @Test  
    public void testHello() {  
        // ...  
    }  
}

即使此时项目中还有另外一个 Bean 在它的初始化方法里写了类似 Thread.sleep(10000) 等操作也不会影响,因为这个 Bean 根本就没有被加载和初始化。

(完)

最近热文: 分享一份Java架构师学习资料! HttpClient 连接池设置引发的一次雪崩! MySQL update语句一个“经典”的坑 一次性搞定 Nginx 限流,问你怕不怕! 面试必考:TCP 的三次握手与四次挥手 为什么大家都说SELECT * 效率低? 100多道难搞的面试题,能答对了多少? 又臭又长!流着泪我也要把它给改完!

——长按关注Java大后端——

e8352e602d5d4b4c2283dd175e188102.png

70c539e3e664fe9277a0620748745f3b.gif 戳原文,获取一份面试题资料!

http://www.niftyadmin.cn/n/874936.html

相关文章

SVN上传文件报错 Commit blocked by pre-commit hook (exit code 1) with output

我这里是因为忘记写comment信息了 参考文章 https://blog.csdn.net/yasi_xi/article/details/39450689

网页自动填写工具_网页表单级联下拉列表框自动填写方法

如上图所示,必须要按顺序选择省市区。未选择省之前,没有城市可选择,未选择城市之前,没有区可选择。代码如下:关键是怎样在自动填写省后,调出对应的市,填写市后,调出对应的区。在网页…

python解决实际问题案例_python 解决粘包问题案例

一,解决粘包问题案例A 服务端from socket import *import subprocessimport structphonesocket(AF_INET,SOCK_STREAM)phone.bind((127.0.0.1,8081))phone.listen(5)print(服务的启动......)# 连接循环while True:conn,client_addrphone.accept()print(client_addr)#…

项目管理模板_Excel项目管理模板V2.0

?点击关注Excel表哥公众号Excel表哥公众号推送的第一篇文章 如何用Excel制作一个高逼格的项目管理模板 累积获得了超多的下载量。下面是和读者朋友的一些交流互动:在使用过程中大家陆续也反馈了一些问题和建议。因此我们推出了项目管理模板V2.0 升级版!…

vue获取兄弟组件的值2020_vue动态组件兄弟间传值

希望新增加的滑动条的开始值是上一个滑动的结束值。以下是具体代码。望解惑。Documentul,li {list-style: none;}增加保存remove{{ items }}var Child {template: :format-tooltip"formatTooltip":max96rangeshow-stops>v-for"item in options":key&qu…

windows 键盘输入突然有了节流效果,不能连续输入同一个键

这是因为使用了筛选键,按以下步骤关闭筛选键即可

springboot如何对本地数据库增删改查_Spring Boot整合Mybatis实现对数据库的增删改查...

写在开始:今天学习了一下springboot,从网上找各种资料,视频,系统的学习了springboot入门,springboot controller,springboot过滤器,监听器,springboot JDBC连接数据库,JPA连接数据库…