Java单元测试之Spock If Esle多分支场景测试
Expect + Where如果业务比较复杂,对应的代码实现会有不同的分支逻辑,类似下面的伪代码:
12345678910111213141516if () { if () { // 代码逻辑 } else { // 代码逻辑 }} else if () { for () { if () { // 代码逻辑 } else { // 代码逻辑 return result; } }}
这样的 if else 嵌套代码因为业务的原因很难避免,如果要测试这样的代码,保证覆盖到每一个分支逻辑的话,使用传统的Junit单元测试代码写起来会很痛苦和繁琐,虽然可以使用Junit的@parametered参数化注解或者dataprovider的方式,但还是不够直观,调试起来也不方便
下面就结合具体的业务代码讲解Spock如何解决这种问题,首先看下业务代码逻辑:
1234567891011121314151617181920212223242 ...
Java单元测试之Spock自带Mock用法
Spock自带的Mock用法之前我们已经介绍了一段业务场景代码,即接口调用,用户服务需要调用用户中心接口获取用户信息,代码如下:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859package com.spock.example.service;import com.spock.example.dao.MoneyDAO;import com.spock.example.dao.UserDAO;import com.spock.example.dto.UserDTO;import com.spock.example.vo.OrderVO;import com.spock.example.vo.UserVO;import org.springframework.beans.factory.annotation.Autowired;import java.math.BigDecimal;import java.util.Li ...
Java单元测试之Spock介绍
Spock 是什么?斯波克是国外一款优秀的测试框架,基于 BDD 思想,功能强大,能够让我们的测试代码规范化,结构层次清晰,结合 groovy 动态语言的特点以及自身提供的各种标签让编写测试代码更加高效和简洁,提供一种通用、简单、结构化的描述语言。
引用官网的介绍如下(http://spockframework.org)
1Spock 是一个 Java 和 Groovy 应用程序的测试和规范框架。 它之所以能在人群中脱颖而出,是因为它优美而富有表现力的规范语言。 斯波克的灵感来自 JUnit、RSpec、jMock、Mockito、Groovy、Scala、Vulcans
简单说 Spock 的特点如下:
让我们的测试代码更规范,内置多种标签来规范单测代码的语义,从而让我们的测试代码结构清晰,更具可读性,降低后期维护难度
提供多种标签,比如: where、with、thrown…… 帮助我们应对复杂的测试场景
使用 groovy 这种动态语言来编写测试代码,可以让我们编写的测试代码更简洁,适合敏捷开发,提高编写单测代码的效率
遵从 BDD 行为驱动开发模式,不单是为了测试覆盖率 ...
Java之流式编程实战
流的使用实战演示,还是以之前我们所写的购物车案例,演示流的各种操作,前置的准备工作:
1234567891011121314151617181920212223242526272829package com.stream.shopping;import com.stream.shopping.cart.Sku;import com.stream.shopping.service.CartService;import org.junit.jupiter.api.BeforeEach;import java.util.List;/** * 流的各种操作 * * @author jinglv * @date 2021/7/21 1:33 下午 */class StreamOperator { List<Sku> skus; @BeforeEach void init() { skus = CartService.getCartSKuList(); } @Test void test() { // …… }}
打印出购物 ...
Java之流式编程介绍
实战:集合与流操作对比分别使用集合操作及Stream流操作,完成对实际应用场景中的数据处理。直观感受流操作带来的便捷性。
购物车案例
沿用Java之函数编程中的购物车的案例。
需求条件:
想看看购物车中都有什么商品
图书类商品都给买
其余的商品中买两件最贵的
只需要两件商品的名称和总价
传统方式处理业务逻辑12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849/** * 以原始集合操作实现需求 */ public static void oldCartHandle() { List<Sku> cartSKuList = CartService.getCartSKuList(); //1. 打印所有商品 for (Sku sku : cartSKuList) { System.out.println(JSONUtil.parse(sku)); } //2. 图书类过滤 ...
Java之常用函数与方法
常用函数接口及使用根据以上的例子,我们定义的SkuPredicate和FileConsumer这两个接口的传参明确指定了对象(Sku和String),这样不够泛化,在JDK8中提供了一些泛化的接口,如下
接口
参数
返回类型
描述
Predicate<T>
T
boolean
用于判别一个对象。比如求一个人是否为男性。
Consumer<T>
T
void
用于接收一个对象进行处理但没有返回,比如接收一个人并打印他的名字
Function<T, R>
T
R
转换一个对象为不同类型的对象
Supplier<T>
None
T
提供一个对象
UnaryOperator<T>
T
T
接收对象并返回同类型的对象
BinaryOperater<T>
(T, T)
T
接收两个同类型的对象,并返回一个原类型对象
函数式接口示例:
rt.jar预制了很多类似的函数式接口
从上面看到,为基础类型提供了很多函数式接口,供我们选择,选择基础类型函数式接口的好处是不会装箱拆箱,提升了很大性能提 ...
Java之Lambda表达式
Lambda表达式简介
Java8 引入函数式编程风格
函数式编程是一种不同的编程思想,定义函数作为一等公民赋值给变量,作为参数或者返回值进行传递
可以理解为一种匿名函数的代替
通过行为参数化传递代码
Lambda表达式的形式
(parameters) -> expression
(parameters) -> {statement;}
Lambda表达式的重要特征
可选的类型声明,可以不声明参数类型,编译器可以统一的识别参数值
可选的参数小括号,一个参数无需小括号,但多个参数需要小括号
可选的大括号,主体包含一个表达式则不需要大括号
可选的返回关键字,主体只有一个表达式返回值,编译器会自动返回值,大括号需要指明的返回值
具体的表现形式
形式一:没有参数
1() -> System.out.println("Hello World")
形式二:只有一个参数
1name -> System.out.println("Hello World from" + name + "!")
形式三:没有参数,逻辑复杂
1234() -> { System ...
常用List集合初始化方式
先创建List再复制
标准方式,先创建集合对象,然后逐个调用add方法初始化。用起来比较繁琐,不太方便。
1234List<Integer> list = ArrayList<>();list.add(1);list.add(2);list.add(3);
使用{{}}双大括号初始化
使用匿名内部类完成初始化。外层的{}定义了一个ArrayList的匿名内部类,内层的{}定义了一个实例初始化代码块。有内存泄露的风险!不建议生产项目中使用!
1234567List<Integer> list = ArrayList<>(Integer){ { add(1); add(2); add(3); }};
使用Arrays.asList
使用Arrays的静态方法asList初始化。返回的list集合是不可变的!
123import java.util.Arrays;List<Integer> list = Arrays.asList(1, 2, 3);
使用Str ...
Java之函数式编程
Java之函数式编程Java从1.8以后引入了函数式编程,这是很大的一个改进。函数式编程的优点在提高编码的效率,增强代码的可读性。
先了解Java新引入的函数式编程,首先了解在没有函数式编程之前,函数编程的演变史。
实战案例:函数编程演变史根据实际场景演示,为了应对不断变化的业务需求,代码的多个改进版本。
购物车案例准备前置需求,购物车相关的实体类、枚举类、服务类等下单商品实体类1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556package com.function.shopping.cart;/** * 下单商品信息对象 * * @author jinglv * @date 2021/6/21 1:19 下午 */public class Sku { /** * 编号 */ private Integer skuId; /** * 商品名称 */ private Strin ...
Virtualbox虚拟机配置双网卡实现固定IP
Virtualbox虚拟机官网:https://www.virtualbox.org
Virtualbox安装CentOS且配置IP
虚拟机安装CentOS并分配2个CPU Core,用于运行Kubeadm
启动虚拟机,选择已下载系统镜像.ios文件,进行CentOS系统安装
配置虚拟机双网卡实现固定IP,且能访问外网
查看虚拟机网络,点击”管理“->”主机网络管理器“,记住IP地址,并选择”手动配置网卡“,修改ip为”192.168.99.1“
网卡1:仅主机host-only
网卡2:网络转换地址NAT
重启虚拟机,ping www.baidu.com返回成功
设置外部网络访问虚拟机
设置静态ip。编辑网络配置文件,编辑网络设置文件
1vi /etc/sysconfig/network-scripts/ifcfg-enp0s3
ONBOOT=yes表示开机启动
BOOTPROTO=static为静态IP生效,IP地址为192.168.99.101
重启网络
1systemctl restart network
查看生效的静态I ...