jmockit-01-test 之 jmockit 入门使用案例

拓展阅读

jmockit-01-jmockit 入门使用案例

jmockit-02-概览

jmockit-03-Mocking 模拟

jmockit-04-Faking 伪造

jmockit-05-代码覆盖率

mockito-01-入门介绍

mockito-02-springaop 整合遇到的问题,失效

jmockit 说明

jmockit 可以提供基于 mock 的测试能力。

两种方式区别

JMockit有两种测试方式,一种是基于行为的,一种是基于状态的测试:

1. Behavior-oriented(Expectations & Verifications)

其定义mock的方式就是先录制好某些方法调用和返回结果,可以通过Expectations实现。 基于行为的Mock 测试,一共三个阶段:record、replay、verify。

1)record:在这个阶段,各种在实际执行中期望被调用的方法都会被录制。

2)repaly:在这个阶段,执行单元测试Case,原先在record 阶段被录制的调用都可能有机会被执行到。这里有“有可能”强调了并不是录制了就一定会严格执行。

3)verify:在这个阶段,断言测试的执行结果或者其他是否是原来期望的那样。

2. State-oriented(MockUp)

覆盖原方法的实现,可以用MockUp实现 具体这两种方法如何使用,会穿插在后面的不同使用场景中。

两种方式使用说明

JMockit有两种测试方式:

1、基于状态的Mock:

是站在目标测试代码内部的,可以对传入的参数进行检查、匹配,才返回某些结果,类似白盒。

主要使用MockUp和@Mock搭配使用实现Mock

2、基于行为的Mock:

就是对Mock目标代码的行为进行模仿,更像是黑盒测试。

主要使用@Test、@Mocked、@Injectable、@Capturing和Expectations搭配使用实现Mock

其实从大的方向来讲,JMockit只有两种Mock方式:new MockUp() 和 new Expectations() 两种。

(1)注解@Mock是和new MockUp()方式搭配使用。

(2)注解@Test、@Mocked、@Injectable、@Capturing是和new Expectations()方式搭配使用。然后@Mocked、@Injectable、@Capturing又有不同的特性,就可以解决不同场景下的Mock了。

拓展阅读

junit5

使用入门

maven 引入

与 springboot 整合

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>jmockit-learn</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.1.5.RELEASE</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

继续添加 jmockit 的依赖

<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope>
</dependency>
<dependency><groupId>org.jmockit</groupId><artifactId>jmockit</artifactId><version>1.34</version><scope>test</scope>
</dependency>

基于 Mockup + @Mock 的用法

例子:

package com.github.houbb.jmockit.learn.biz;import com.github.houbb.jmockit.learn.model.UserInfo;
import com.github.houbb.jmockit.learn.service.UserService;
import mockit.*;
import mockit.integration.junit4.JMockit;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;@RunWith(JMockit.class)
public class UserBizMockUpCaseTest {// 待测试的实现,需要指定为具体的实现@Testedprivate UserBiz userBiz;// 依赖的属性,进行 mock@Injectableprivate UserService userService;@Testpublic void test() {//mocknew MockUp<UserService>(userService) {@Mockpublic UserInfo queryById(String id) {UserInfo user = new UserInfo();user.setId(id);user.setName(id+"-name-mock");return user;}};UserInfo userInfo = userBiz.queryUserInfo("2");Assert.assertEquals("2-name-mock", userInfo.getName());}}

基于状态的测试

{% raw %}
package com.github.houbb.jmockit.learn.biz;import com.github.houbb.jmockit.learn.model.UserInfo;
import com.github.houbb.jmockit.learn.service.UserService;
import com.github.houbb.jmockit.learn.service.impl.UserServiceImpl;
import mockit.*;
import mockit.integration.junit4.JMockit;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;@RunWith(JMockit.class)
public class UserBizMockedTest {// 依赖的属性,进行 mock@Mockedprivate UserServiceImpl userService;@Testpublic void test2() {// 录制(Record)new Expectations() {{userService.queryById((String) any); result = new UserInfo("any-other", "any-other-name");}};//重放(Replay)UserInfo userInfo1 = userService.queryById("1");UserInfo userInfo2 = userService.queryById("2");UserInfo userInfo3 = userService.queryById("3");// 也可以断言Assert.assertTrue(userInfo1.getName().equals("any-other-name"));// 验证,验证被调用,且被调用了3次new Verifications() {{userService.queryById((String) any);times = 3;}};}}
{% endraw %}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/777837.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

移动端开发思考:Uniapp的上位替代选择

文章目录 前言跨平台开发技术需求技术选型uniappFlutterMAUIAvalonia安卓原生 Flutter开发尝试Avalonia开发测试测试项目新建项目代码MainViewMainViewModel 发布/存档 MAUI实战&#xff0c;简单略过打包和Avalonia差不多 总结 前言 作为C# .NET程序员&#xff0c;我有一些移动…

前端基础复习--HTML篇

html: html文件根标签 head&#xff1a;编写页面相关的属性 title&#xff1a;页面标题 body&#xff1a;页面内容展示信息 标题标签&#xff1a;h1 - h6&#xff0c;数字越大&#xff0c;字体越小 &#xff0c;例如&#xff1a; <h1>hello</h1> p标签&#x…

|行业洞察·手机|《2024手机行业及营销趋势报告-18页》

报告的主要内容解读&#xff1a; 手机行业概述及品牌分布&#xff1a; 2022年&#xff0c;受疫情影响&#xff0c;中国国内手机市场出货量下降22.6%&#xff0c;总计2.72亿部。5G手机市场占有率中&#xff0c;苹果领先&#xff0c;其次是vivo、OPPO和华为。消费者换机时更注重性…

【python分析实战】成本:揭示电商平台月度开支与成本结构占比 - 过于详细 【收藏】

重点关注本文思路&#xff0c;用python分析&#xff0c;方便大家实验复现&#xff0c;代码每次都用全量的&#xff0c;其他工具自行选择。 全文3000字&#xff0c;阅读10min&#xff0c;操作1小时 企业案例实战欢迎关注专栏 每日更新&#xff1a;https://blog.csdn.net/cciehl/…

[git]Git 撤销与 回滚操作

[git]Git 撤销与 回滚操作 开发过程中&#xff0c;你肯定会遇到这样的场景&#xff1a; 场景一&#xff1a; 糟了&#xff0c;我刚把不想要的代码&#xff0c;commit到本地仓库中了&#xff0c;但是还没有做push操作&#xff01; 场景二&#xff1a; 彻底完了&#xff0c;刚线…

C# OpenCvSharp 轮廓检测

目录 效果 代码 下载 效果 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using OpenCvSharp; using OpenCvSharp.…

刚租用的服务器被恶意攻击怎么办?

如果你的服务器受到恶意攻击&#xff0c;以下是一些应对措施&#xff1a; 1.立即隔离受影响的系统&#xff1a; 立即将受攻击的服务器与其他系统隔离&#xff0c;以防止攻击进一步蔓延。这可以通过断开网络连接、关闭受影响的服务或者停止服务器实例等方式来实现。 2.通知相关人…

OpenCV 如何使用 XML 和 YAML 文件的文件输入和输出

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;如何利用OpenCV4.9离散傅里叶变换 下一篇: 目标 本文内容主要介绍&#xff1a; 如何使用 YAML 或 XML 文件打印和读取文件和 OpenCV 的文本条目&#xff1f;如何对 OpenCV …

随记----单链表

随便记录一些代码 1.编写算法将带头结点的链表逆置&#xff0c;空间复杂度为1 void Reverse(LinkLNode &L){LNode *pL->next,*r;L->nextNULL;while(r!NULL){rp->next;p->nextL->next;L->nextp;pr;} } 6.有一个带头节点的单链表L&#xff0c;设计一个算法…

镜视界 | DevSecOps CI/CD 管道中数字供应链安全的集成策略

目录 前言 数字供应链&#xff08;DSC&#xff09;的定义 数字供应链安全的重点内容和风险因素 CI/CD管道的安全目标和可信实体 将数字供应链安全集成到CI/CD管道中 结语 本文字数&#xff1a;7715&#xff0c;阅读时长&#xff1a;19分钟 1.前言 在敏捷开发的模式下&…

CSS 结构伪类选择器 伪元素选择器 盒子模型

目录 1. 结构伪类选择器1.1 :nth-child(公式) 2. 伪元素选择器3. 盒子模型3.1 盒子模型的重要组成部分3.2 盒子模型 - 边框线3.3 盒子模型 - 内边距3.4 盒子模型 - 尺寸计算3.5 盒子模型 - 外边距3.6 盒子模型 - 元素溢出3.7 外边距问题 - 合并现象3.8 外边距问题 - 塌陷问题3.…

玩电脑突然停电对电脑有影响吗

在现代社会中&#xff0c;电脑已成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;当我们正在专注于工作或娱乐时&#xff0c;突然停电可能会给我们带来不小的困扰。那么&#xff0c;玩电脑时突然停电会对电脑产生哪些影响呢&#xff1f;本文将深入探讨这一问题&…

Android 14.0 SystemUI下拉状态栏时间格式的修改(二)

1.概述 在14.0的系统rom产品开发中,在通过上一篇博客已经实现修改了时间显示格式,但是客户修改下拉状态栏时间显示格式为分行显示,即第一行显示时间用大字体显示, 第二行用小字体显示当前日期和周几这样的显示格式 于是继续进行修改 2.SystemUI下拉状态栏时间格式的修改(…

快速上手Spring Cloud 七:事件驱动架构与Spring Cloud

快速上手Spring Cloud 一&#xff1a;Spring Cloud 简介 快速上手Spring Cloud 二&#xff1a;核心组件解析 快速上手Spring Cloud 三&#xff1a;API网关深入探索与实战应用 快速上手Spring Cloud 四&#xff1a;微服务治理与安全 快速上手Spring Cloud 五&#xff1a;Spring …

【OpenAI援引马斯克评价中国】小米汽车 SU7 顶配版或超 30 万/OpenAI 加持机器人亮相/荣耀已投入 100 亿研发 AI

雷军&#xff1a;共建一个更良性包容的汽车市场舆论环境 Figure 与 OpenAI 联手推出新机器人 亚马逊和 Google 悄悄降低对生成式 AI 的预期 小米生态链模式大改革&#xff0c;将进行分级管理 掌阅科技&#xff1a;致力打造国内首款真正 AI 阅读应用 荣耀称已投入 100 亿用于 AI…

c++中2种返回变量类型名称的方法

std::string real_name abi::__cxa_demangle(typeid(*(*a)).name(), NULL, NULL, &status);必须使用#include <typeinfo> std::string real_name boost::core::demangle(typeid(*(*a)).name());必须使用 #include <boost/core/demangle.hpp> #include <t…

element el-table表格默认勾选toggleRowSelection失效问题

想要实现一个表格默认勾选上次选过的项的功能&#xff1a; 发现直接使用toggleRowSelection不生效&#xff0c;必须使用setTimeout延迟一会才能生效。 表格&#xff1a; <el-tableref"table"borderstripe:data"rows"selection-change"val > (se…

设计模式之原型模式讲解

原型模式本身就是一种很简单的模式&#xff0c;在Java当中&#xff0c;由于内置了Cloneable 接口&#xff0c;就使得原型模式在Java中的实现变得非常简单。UML图如下&#xff1a; 我们来举一个生成新员工的例子来帮助大家理解。 import java.util.Date; public class Employee…

植物大战僵尸Javascript版web游戏源码

源码介绍 植物大战僵尸Javascript版web游戏源码&#xff0c;非常强大&#xff0c;1比1还原电脑版植物大战僵尸游戏&#xff0c;带背景音乐&#xff0c;玩法和原版一模一样。 源码截图 下载地址 https://download.csdn.net/download/huayula/89048275

vue3从精通到入门5:模板语法与指令

Vue 3 的模板语法和指令与 Vue 2 相比&#xff0c;大部分内容仍然是相同的&#xff0c;但是有一些新的改进和优化。以下是对 Vue 3 模板语法和指令的简要概述&#xff1a; 模板语法 Vue 3 的模板语法基于 HTML&#xff0c;允许你使用双大括号 {{ }}来绑定数据&#xff0c;以…