测试类写法以及几种常用方式

七分钟教会你如何编写一个合格的测试用例 如何设计测试用例,这些设计方法:等价类、边界值、错误猜测法、场景法、因果图法、正交排列,你都掌握了吗? 阅读详情
AI摘要

本文详细介绍了如何使用测试类进行功能自查、后期维护及接口调用模拟,包括常用的jar包介绍、测试Restful接口方法、通过Mock模拟方法调用结果判读和方法调用次数注意事项等内容。

为什么需要测试类

  • 方便模拟验证已完成功能

    开发过程中,代码完成之后,在正式提交测试之前,往往需要自己对功能进行自查,修改一些明显的问题。但是有时候由于本地环境限制,实际流程和数据难以模拟,为了不影响其他模块,我们可以只针对自己新增加的功能进行测试。这时可以使用测试类,针对自己的接口,模拟特定的数据和环境,将测试的接口返回值与预期返回值进行对比,完成验证测试。

  • 方便后期维护

    由于项目开发过程中,经常有需求变更,有时候会有涉及范围很广的改动,有完善的测试类,可以在大面积改动的时候,检查出一些明显的问题,针对改动能对项目掌控的更好,节省测试时间,减少工作量。

常用的jar包

org.junit.* Junit4 框架

是通用的测试 java 程序的测试框架JUnit可以对Java代码进行白盒测试。
org.junit.Assert.* 断言,用于对比结果是否符合预期,用来判断测试结果的常用框架

org.mockito.* mock

也叫打桩,用来模拟数据,模拟方法调用


下面以SpringBoot为例,展示下测试类的具体使用


测试模拟接口调用

有接口 TestService 参数为String name 返回结果是 "Hello " + name

@Service
public class TestServiceImpl implements TestService {
    /**
     * 测试接口
     */
    @Override
    public String testInterface(String name) {
        return "Hello " + name;
    }
}

这是我们的测试类

@RunWith(SpringRunner.class)
@ActiveProfiles("ut")
@SpringBootTest
public class SiteCacheTest extends BaseTest {
    @Autowired
    private TestService testService ;
    @Test
    public void testInterface() {
    String result = testService.testInterface("Tom");
    Assert.assertEquals("Hello Tom", result );
    }
}

测试结果是运行成功,这是一个很简单的例子,没有复杂的参数和业务逻辑,接口内部也没有对其他接口的调用。
在这个测试类中
@ActiveProfiles(“ut”) 表示该测试运行时使用的是 application-ut.properties配置文件,我们实际开发工作中,往往会有多个环境,可以给测试类指定环境,方便控制测试,以及防止测试数据对实际环境造成影响。
@SpringBootTest 该注解表示这个类是一个SpringBoot测试类
Assert.assertEquals(“Hello Tom”, result )
该方法接收两个参数,前者为期望值,后者为实际值,如果不一致,会测试失败
Assert还有很多类似的方法,常用的有
1 - Assert.fail()

让测试直接出错,抛出 AssertionError 。

2 - Assert.fail(String message)

让测试直接出错,并在抛出 AssertionError 时输出 message 作为错误提示信息。

3 - Assert.assertNull(Object object)

猜测 object 为 null,如果不为 null ,抛出 AssertionError 。

4 - Assert.assertSame(Object expected, Object actual)

猜测 expected 对象和 actual 对象引用的是同一个对象。 如果不同,抛出 AssertionError 。

5 - Assert.assertNotSame(Object expected, Object actual)

猜测 expected 对象和 actual 对象引用不同的对象。 如果相同,抛出 AssertionError 。

6 - Assert.assertTrue(boolean condition)

猜测 condition 为 true 。 如果为 false ,抛出 AssertionError 。

7 - Assert.assertFalse(boolean condition)

猜测 condition 为 false 。 如果为 true , 抛出 AssertionError 。

8- Assert.assertEquals(long expected, long actual)

猜测两个 long 类型 expected 和 actual 的值相等。 如果不相等,抛出 AssertionError 。

9 - Assert.assertNotEquals(long unexpected, long actual)

猜测两个 long 类型 unexpected 和 actual 的值不相等。 如果相等,抛出 AssertionError 。

测试Restful接口

前后台返利开发中,针对给前台调用的接口,经常会有一些500错误等,可以模拟请求,根据接口路径来模拟前端调用
通常会传一些错误参数来验证返回错误信息的情况。

@ActiveProfiles("ut")
@RunWith(SpringRunner.class)
@SpringBootTest
public class ControllerTest {
    @Autowired
    private WebApplicationContext wac;
    private MockMvc mvc;
    @Before
    public void setUp() {
        mvc = MockMvcBuilders.webAppContextSetup(wac).build(); //初始化MockMvc对象
    }
    @Test
    public void testController() throws Exception {
        String json = "{\n" +
                "\t\"username\": \"admin\",\n" +
                "\t\"password\": \"1234\"\n" +
                "}";
        String json1 = "{\n" +
                "\t\"username\": null,\n" +
                "\t\"password\": \"1234\"\n" +
                "}";
        mvc.perform(MockMvcRequestBuilders.post("/test/login")
                .contentType(MediaType.APPLICATION_JSON_UTF8)
                .accept(MediaType.APPLICATION_JSON_UTF8)
                .content(json1.getBytes()))//传json参数
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print());
        mvc.perform(MockMvcRequestBuilders.post("/test/login")
                .contentType(MediaType.APPLICATION_JSON_UTF8)
                .accept(MediaType.APPLICATION_JSON_UTF8)
                .content(json.getBytes()))//传json参数
                .andExpect(MockMvcResultMatchers.status().isInternalServerError())
                .andDo(MockMvcResultHandlers.print());
    }
 }

如上,我们传正常的参数时,期望返回200, 即 MockMvcResultMatchers.status().isOk()
传参数错误时返回 500, 即MockMvcResultMatchers.status().isInternalServerError()

在这个测试类中
首先需要引入WebApplicationContext 用来模拟前台接口调用

@Before 该注解注解的方法,会在测试运行之前先运行,一般用于准备测试数据,初始化对象等,在此例中,我们用来初始化测试用的MockMvc 对象。
@Autowired 测试类可以像正常的类一样,注入你所需要的对象
MockMvcRequestBuilders 来指定测试接口路径,以及请求方式
.andExpect 类似断言, 来指定期望值。

通过Mock模拟方法调用结果

在开发过程中,类都不是独立的,往往一个方法的实现,需要调用多个不同地方的方法组合来实现一个功能,在测试中,我们需要其他方法的返回值满足我们的测试需要,这个时候可以使用@Spy注解来包装某个类,控制它的方法返回值。
下面看例子

@RunWith(SpringRunner.class)
@ActiveProfiles("ut")
@SpringBootTest
public class MockTest {
    @Spy
    @Autowired
    private TestService testService;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void codeTest() {
        Mockito.when(testService.getUUID()).thenReturn("cdc60ad5609ddced1b128c60ac92340d");
    }
 }

在这个测试类中,testService中存在一个方法getUUID(),是返回随机id的,但是在我们要测试的方法中调用了这个方法,我们需要用到这个uuid,来模拟数据,以便测试我们的接口,比如我们需要根据它去另外一张表查询数据,但是我们不知道调用时随机的uuid是什么,这时候可以指定它的返回值,当testService.getUUID()被调用时,返回一个指定的值,这样我们就可以继续操作了。

@Spy 对一个注入的类进行包装,以便可以模拟方法返回值
我们需要使用 MockitoAnnotations.initMocks(this); 来初始化对象,该方法会对使用了**@Spy**的类进行初始化。
然后我们可以针对初始化过的对象来模拟返回值。

Mockito.when(xxx).thenReturn(xxx);
从字面可以看出,当…的时候返回…
需要注意的是when(…) thenReturn(…)会调用真实的方法,如果你不想调用真实的方法而是想要mock的话
就使用 doReturn(…) when(…) 不会调用真实方法

判读方法调用次数

有些时候针对循环和和判断较多,或者业务逻辑较为复杂的场景,需要判断方法调用次数。 还有一个场景是判断缓存是否生效,对于加了缓存的方法,多次调用,一般只有一次实际的调用,可以用这个方法来判断调用次数。

@RunWith(SpringRunner.class)
@ActiveProfiles("ut")
@SpringBootTest
public class CallTimesTest {
    @MockBean
    private TestDao testDao;
    @Autowired
    private TestService testService;

    @Test
    public void testCallTimes() {
        //设置第一次返回,第二次返回
        when(testDao.findUserByName(1))
                .thenReturn("user1")
                .thenReturn("user2");

        String user1 = testService.findUserByName(1);
        Assert.assertEquals("user1", user1);

         String user2 = testService.findUserByName(1);
        Assert.assertEquals("user1", user1);
        verify(testDao, times(1)).findWithFullNameByTaskId(1);
    }

假设 testService 的findUserByName 方法内部是调用的 testDao的findUserByName方法,我们首先使用**@MockBean** 注解 注解testDao ,对其进行包装,然后我们可以对其进行模拟 ,设置第一次调用返回user1,第二次调用返回user2, 然后testService调用两次,如果在testDao的findUserByName方法上加了缓存,那么对于同样的入参,实际上只会调用一次。
我们可以使用verify来验证方法调用次数。

需要注意的是,findUserByName 方法这里我们的入参是1,在mock中我们有时候不需要写死参数,而是符合一定条件的参数即可,mock提供了一系列方法指定参数,如下图
在这里插入图片描述

注意事项

  • 测试要注意覆盖率,不要只测试正确的情况,也要测试异常的情况
  • 要模拟方法调,设定返回值需要先对类进行包装,@Mock 和@Spy注解均可以实现,区别在于前者是虚假的调用,而且不能mock自动装配的Bean,需要和@InjectMock配合使用;而后者监测真实的调用,方法实际上真的调用了,使用时要注意,想要不调用,可以使doReturn(…) when(…)。
  • 在maven项目中,不设置skiptest=true的话,在打包时会默认先执行一遍测试类,所以要注意设置测试类运行环境,以免测试数据对正式环境造成污染,导致不必要的错误,更为规范的做法是,在每个测试用例中,最后对测试数据进行删除。
Junit单元测试之断言(Assert) Junit为我们提供了一些辅助函数,他们用来帮助我们确定被测试的方法是否按照预期的效果正常工作。 一、assertEquals 函数原型1: Assert.assertEquals([String message],expected,actual) 参数说明: message(可选):将会在发生错误时报告这个消息。 expected(必填):期望值,通常都是用户指定... 阅读详情

相关推荐

ResultActions.andExpect,andDo的疑问

关于Mock的疑问解答如下:   转自: http://jinnianshilongnian.iteye.com/blog/2004660 http://jinnianshilongnian.iteye.com/blog/1893135

Top5软件工程硕士,先后在京东、字节从事多年Java后端开发、实时和离线大数据开发 4091

XXXXXXXXXXXXXXXXXXXXX

public class FTPUtil {  public static Log logger = LogFactory.getLog(FTPUtil.class);  private static String userName; // FTP ��¼�û���  private static String password; // FTP ��¼����  private stati

小菜鸟的博客 68万+

Elsevier投稿别再踩坑了!手把手教你搞定LaTeX模板和所有附件(附避坑清单)

本文详细解析Elsevier投稿全流程中的关键环节,特别是LaTeX模板的使用和系统提交的常见问题。从必备文件准备到LaTeX模板适配,再到投稿系统操作指南,提供全面的避坑清单和实用技巧,帮助科研工作者高效完成投稿,避免因格式错误或文件遗漏导致的退稿风险。

weixin_30915275的博客 551

java中的测试类_java中测试类的方法

java中测试类的方法发布时间:2020-06-26 14:20:22来源:亿速云阅读:105作者:Leah这期内容当中小编将会给大家带来有关java中测试类的方法,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。首先,打开您的项目。我创建的是maven项目,这对于是否使用maven并没有太大关系,方法都是一样的接下来,找到下图所示的位置,然后就可以开始写您的测试类...

weixin_39703551的博客 9845

ESP8266+Mixly+MIXIO物联网实战:用色盘控制WS2812 RGB灯(附完整代码)

本文详细介绍了如何利用ESP8266微控制器、Mixly图形化编程工具与MIXIO物联网平台,快速构建一个可通过网页色盘远程控制WS2812 RGB智能灯带的实战项目。内容涵盖硬件接线、平台配置、代码编写与调试全流程,旨在帮助物联网爱好者与初学者轻松实现创意灯光应用,掌握智能硬件开发的核心技能。

gin88的博客 261

Vue项目实战:海康WebControl插件从安装到预览功能全流程(附RSA加密避坑指南)

本文详细介绍了在Vue项目中集成海康威视WebControl插件的全流程,从环境准备、插件部署到核心功能实现。重点解析了使用JS_RequestInterface获取RSA公钥并进行加密参数初始化的关键步骤与常见避坑指南,帮助开发者高效完成监控视频预览功能的开发与调试。

linux6sysadmin的博客 1227

java定义类和测试类时的三种方式

1. 在test包下分别创建一个Person类和PersonTest测试类,在测试类中可以直接用Person来new一个对象 2. 把定义类和测试类这两个类放在一个源文件中,注意:一个java源文件中只能有一个public类 package test; class Person { String name; int age; int sex; public void study() { System.out.println("studying"); } ...

希望和大家多多交流技术! 1万+

QT使用openssl实现RSA加解密

使用openssl生成公私钥,随后用QT对相应的信息进行RSA加解密

weixin_42098322的博客 3867

枚举的几种常用写法

在实际项目当中,很多时候需要用到一些静态的变量。我们首先想到的就是使用枚举了,本文介绍一下枚举的常用方式! 第一种经常用到: 1.ANIMAL_CAT(“CAT”,“猫”)相当于EnumAnimal的实例。 2."CAT"为实例的code,"猫"为实例的name。 package enums; public enum EnumAnimal { ANIMAL_CAT("CAT","猫"), ...

kin_wen的博客 8377

医疗领域BGE-M3模型微调全流程:从数据准备到效果评估

本文详细介绍了医疗领域BGE-M3模型的微调全流程,从数据准备到效果评估。通过医疗数据微调,BGE-M3模型在临床问答、病历检索等场景中表现显著提升,能够准确理解医学术语之间的细微差别。文章还提供了实战练习代码和效果评估指标,帮助开发者快速掌握医疗文本嵌入模型的应用技巧。

weixin_29098367的博客 281

VSCode 配置 Claude Code 插件的 4 步安装法与 3 类常见报错解决方案

介绍 VSCode 中 Claude Code 插件的 4 步可靠安装流程与 3 类高频报错(上下文丢失、认证失败、加载卡死)的根因分析和精准修复方案,聚焦文件上下文捕获机制、请求头注入要求及缓存失效逻辑,提供可验证的命令行操作与日志定位方法。

weixin_28728443的博客 495

两种调用方法类的测试类写法。

第一种:在测试类里实例化方法类,调用方法,注意参数。 packagecom.example.model; importjava.util.List; importcom.example.model.*; publicclassTestBeerExpert { ...

chuai9367的博客 1488

IgH EtherCAT 从入门到精通:第 29 章 实战:EoE 远程维护通道搭建

摘要:本章详细介绍了基于EoE(Ethernet over EtherCAT)协议的远程维护通道搭建方案。主要内容包括:1)网络架构设计,采用管理网络与EoE子网隔离的方案;2)从站EoE支持确认与IP地址配置,提供API和命令行两种方式;3)路由/交换两种部署模式,重点推荐路由模式并给出自动化配置脚本;4)SSH远程访问配置,包括直接连接和跳板访问两种方式;5)安全加固措施,如防火墙规则、SSH密钥认证等;6)故障恢复机制与性能注意事项。该方案实现了通过EtherCAT网络对从站设备的远程SSH访问、文件

从事嵌入式linux android驱动开发,拥有全栈能力 360

SpringBoot接收参数的几种常用方式

Springboot接收请求参数到底有哪些方式,如何使用呢?本篇文章更多的通过示例来讲解,彻彻底底对参数这一块知识进行掌。1、传单个参数的时候可以使用@RequestParam,不带也可以,带上就意味着前端必须传这个值。2、实体接受参数的话,不可以带,带上就会报错。不带的话是可以接受多个参数的。并且没有key限制。

怪咖@的博客 2万+

【毫米波混合波束成形】第3章 深度展开网络:将迭代优化嵌入计算图

相位提取算子 $P_\phi: \mathbb{C}^N \to \mathbb{C}^N$ 定义为逐元素相位归一化 $P_\phi(z) = \exp(j \cdot \angle z)$。该算子在复数域非全纯(Non-holomorphic),标准反向传播需扩展至Wirtinger微积分框架。对于复数变量 $z = x + jy$,Wirtinger导数定义:相位提取算子的Jacobian矩阵在极坐标下具有稀疏结构。

VectorShift的博客 406

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

一次面向初学者的完整实战:从零构建SpringBoot测试类

测试是保证软件质量的核心手段,而 Spring Boot 为开发者提供了开箱即用的测试框架。本文以一段真实可编译的代码片段为起点,逐步剖析如何在 Spring Boot 项目中编写并运行一个最小可复用的测试类。文章将覆盖依赖准备、测试类结构、执行流程、常见误区与调试技巧,并穿插对测试设计思想的简要讨论。全文约三千字,力求用平实准确的语言还原一次完整的测试落地过程。

小L的博客 2492

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

SSM项目中的测试类的写法

SSM项目中的测试类的写法 首先导入依赖 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.1.7.RELEASE</version> &l...

weixin_44012722的博客 3713

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

小程序SringBoot接口项目测试类写法

小程序SringBoot接口项目测试类写法 话不多说,直接上代码: //创建一个接口测试类 public class PersonInfoActionTest { //写一个main方法 public static void main(String[] args){ //创建测试类对象 PersonInfoActionTest test=new...

qq_43732387的博客 245

SpringBoot 测试类无法自动注入@Autowired,测试类报错:NullPointerException

在使用SpringBoot搭建多数据源的时候遇到问题,如图所示: 虽然这个下划线的红色编译运行不会报错,但是看着很不舒服,将@Autowired换成了@Resource注解就可以了,但是具体原因还有待考究,有大佬知道可以评论一下。 运行测试类,一直报错: java.lang.NullPointerException…太多了,不想粘贴 空指针问题本来我以为是上面的@Autowired问题,换成了...

qq_42621977的博客 2213

在 Spring 中简单地使用测试类

文章目录1. 前言2. Spring 中使用测试类2.1 功能需求2.2 开发环境2.3 编写代码2.4 代码测试2.4.1 方法一2.4.1 方法二3. 总结 1. 前言 想着可能以后用测试类比较多,所以,就在在这里简要地记录一下 Spring 中如何使用测试类 2. Spring 中使用测试类 2.1 功能需求 在测试类中判断实体类的属性值是否与给定的值相等 2.2 开发环境 IDEA-2019.1 MAVEN-3.5.3 Spring-5.0.6.RELEASE 2.3 编写代码 【项目结构】:

菩提小猿的博客 1650

MyBatis常用的几种分页方式

MyBatis常用的几种分页方式 为什么要分页? 如果前端需要展示数据时,由于数据量庞大,一次性展示,这时页面将会出现一大片数据,而且还不一定加载完成,效率很差,此时分页查询就可以很好的解决这一问题,将庞大的数据按照一定数目显示出,还可以通过点击下一页或者上一页展示其它数据,效率更高! 下面来介绍下mybatis常用的几种分页查询! 首先看一下数据库里所有的数据,细节代码里有注解 1、使用Limit分页 sql使用的核心语句 -- 语法:表示从startIndex下标开始,一页显示pageSize个 s

Mq_sir的博客 2420

AOP常用的几种增强方式

AOP常用的几种增强方式

lC518800的博客 1407

测试类怎么写?

首先,测试类是测试功能的,作为开发人员,它能够保住你的money,但是测试类怎么写呢?下面是一个简单的测试类,详情看注释:package medicalplatform; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autow...

qq_38266019的博客 1万+

Apex开发 -- 测试类

学习目的 0,为什么要写测试类 1,测试类的注解 2,测试类里获取Metadate的方式 3,测试类编写技巧 4,Batch Class测试类编写 5,Call Out Class测试类编写 为什么要写测试类 Salesforce有一个机制,就是从沙盒环境部署到生产环境,测试类对业务逻辑代码的覆盖率必须大于等于75%。当然,如果要说还有其他的写测试类的必要,那就是为了做单元测试,规范,规范,规范...

weixin_41126799的博客 1050

SpringBoot中使用测试类进行测试

在复习springboot的过程中忘记了测试类该如何去配置运行,经过查阅以前的资料以及网络资料,整合如下。引入依赖 编写测试类 测试在学习的过程中总会有些许遗忘点,只有通过不断的学习,不断的复习,不断的实践,才能有所收获。......

爱学习的大雄的博客 2357

springboot测试类原理

使用trea编写自动测试类,发现不能执行,之前虽然看过测试类相关的内容,但是也只大概知道是怎么样的,对测试类代码和原理等没有很清晰的概念,只记得使用SpringbootTest注解,通过快捷键对每个接口,方法生成测试代码,通过assert断言判断结果是否符合预期,可以写一个类似整体的测试方法, 一点击便会执行所有的测试方式,通过mockMvc模拟一个http请求等。

qq_39594281的博客 1047
上一篇: HashMap原理
下一篇: SpringBoot在静态方法中使用注入Bean
徐光耀
博客等级 码龄12年 19粉丝 9原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值