当前位置: 代码网 > it编程>编程语言>Java > Spring Boot单元测试

Spring Boot单元测试

2024年08月02日 Java 我要评论
一文快速讲解SpringBoot单元测试,五分钟,掌握规范的SpringBoot单元测试。

目录

1.概述

2.基本使用

3.优势

4.常用属性


1.概述

所谓单元测试就是对功能最小粒度的测试,落实到java中就是对单个方法的测试。对单个方法的测试用junit即可,关于junit作者另一位篇文章中有详细介绍,感兴趣的小伙伴可以去看看:

详解junit-csdn博客

junit可以完成单个方法的测试,但是对于spring体系下的web应用的单元测试是无能为力的。因为spring体系下的web应用都采用了mvc三层架构,依托于ioc,层级之间采用了依赖注入的方式来进行调用。如果应用不启动、ioc容器不进行初始化、依赖没有被注入进ioc容器,根本就没办法正常的使用。调controller,会由于service没注入而报空指针异常,调service,会由于dao没注入而报空指针异常。

所以我们发现想要对spring boot进行单元测试,前置条件就是需要启动应用,或者说准确点是需要启动ioc。但很明显我们又不可能每次都去直接启动应用来进行测试,一些架构糟糕、很重的老应用启动,动不动就是几分钟甚至十几分钟。我们不可能每次写一点新的代码,想要测试就去重启一下,这样效率太低了。

为此spring boot test为我们提供了@springboottest来对springboot应用进行快捷的单元测试。

2.基本使用

一般单元测试类我们都放在test路径下,一个@test就是一个case(用例):

在从 spring boot 1.4.0 版本以前@springboottest需要和@runwith配合来使用

@runwith(springrunner.class)用来指定启动类是哪个?@springboottest用来加载应用上下文

依赖:

代码示例:

import org.junit.runner.runwith;
import org.springframework.boot.test.context.springboottest;
import org.springframework.test.context.junit4.springrunner;

@runwith(springrunner.class)
@springboottest
public class myapplicationtests {

    // 测试内容

}

在从 spring boot 1.4.0 版本开始就不用加上@runwith了,直接使用@springboottest就可以了。

代码示例:

import org.springframework.boot.test.context.springboottest;
import org.springframework.boot.test.context.springboottest.webenvironment;
import com.example.myapplication; // 替换成实际的主启动类所在的包

@springboottest(classes = myapplication.class)
public class myapplicationtests {

    // 测试内容

}

3.优势

我猜到这儿很多小伙伴有所疑惑:

既然@springboottest也要启动主启动类,那和我们直接启动springboot应用来测试有什么区别喃?@springboottest的优势在哪儿?

答案是——轻量级:

@springboottest 注解提供了轻量级的测试环境,相比直接启动整个应用程序,它可以只加载所需的配置和组件,从而使测试更加迅速。这对于单元测试是非常有利的,因为它们通常关注的是某个组件或模块的功能,而不是整个应用程序。

4.常用属性

@springboottest 注解提供了许多属性,用于配置测试的上下文加载和应用程序启动。以下是一些常用的 @springboottest 属性:

classes:

指定启动测试时加载的配置类或主启动类。可以使用其中一个属性,根据需要选择。

webenvironment:

指定测试的 web 环境。可以设置为 webenvironment.mock(默认值,使用 mockmvc)或 webenvironment.random_port(随机端口,真正启动嵌入式容器)等。

@springboottest(webenvironment = webenvironment.random_port)

webenvironment.mock:

在这种模式下,不会启动真正的嵌入式 web 服务器,而是使用 mockmvc 框架模拟 http 请求和响应。这样可以在没有真实服务器的情况下测试控制器的行为。适用于测试控制器层的逻辑,但不需要测试整个 web 应用程序的场景。

webenvironment.random_port:

在这种模式下,会启动嵌入式 web 服务器,并使用一个随机的端口。这允许测试整个应用程序的集成,包括 http 请求和响应。适用于测试整个应用程序的场景,但不会影响外部系统。

webenvironment.defined_port:

random_port 类似,但是在这种模式下,使用的端口是固定的,可以在属性中配置。这适用于需要预定义端口的场景,例如与外部系统集成时。

webenvironment.none:

在这种模式下,不会启动任何嵌入式 web 服务器,也不会模拟 http 请求和响应。这种模式适用于单元测试,主要测试业务逻辑,而不涉及与 web 环境的交互。

properties:

指定配置属性。

@springboottest(properties = "my.property=value")

exclude:

指定要排除的配置类。

@springboottest(exclude = {someconfiguration.class, anotherconfiguration.class})

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com