hutool操作Excle
Hutool中操作Excel工具类Hutool官网
Hutool-poi 是针对 Apache POI 的封装,因此需要用户自行引入 POI 库,Hutool 默认不引入。到目前为止,Hutool-poi 支持:
Excel 文件(xls、xlsx)的读取(ExcelReader)
Excel 文件(xls、xlsx)的写出(ExcelWriter)
引入 Hutool 的依赖或者 Jar 包,分别引入 POI 和 Hutool 的依赖。
1234567891011<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.3.8</version></dependency><dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml< ...
easyexcel操作Excle
EasyExcel官方文档–语雀
EasyExcel GitHub地址
EasyExcel解析工具
EasyExcel的优点Java 中操作 Excel 的框架 POI、JXT,但是他们都存在一个问题:非常的消耗内存。这时候阿里的大佬在 POI 的基础上进一步重写,封装得到了 EasyExcel,它最大的好处就是解决了过于消耗内存问题,也让使用者使用更加便利。
EasyExcel操作Excel引入依赖1234567891011121314151617<dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-base</artifactId> <version>${easypoi.version}</version> </dependency> <dependency> <groupId>cn.afterturn</group ...
POI操作Excle
POIPOI介绍
Apache POI 简介是用 Java 编写的免费开源的跨平台的 Java API,Apache POI 提供 API 给 Java 程式对 Microsoft Office(Excel、WORD、PowerPoint、Visio 等)格式档案读和写的功能。POI 为“Poor Obfuscation Implementation”的首字母缩写。
官网以及参考的文档地址:
官方主页:http://poi.apache.org/index.html
API 文档:http://poi.apache.org/apidocs/index.html
POI常用的类和接口Apache POI 包含类和方法,来将 MS Office 所有 OLE 2 文档复合。此 API 组件的列表如下:
HSSF 提供读写 Microsoft Excel XLS 格式档案的功能
XSSF 提供读写 Microsoft Excel OOXML XLSX 格式档案的功能
HWPF 提供读写 Microsoft Word DOC 格式档案的功能
HSLF 提供读写 Microsoft Pow ...
Java之流式编程收集器详解
归约与汇总
归约(reduce):将Stream流中元素转换成一个值
汇总(collect):将Stream流中元素转换成一个容器(集合类等的容易)
归约将Stream流中元素转换成一个值,只返回一个值!!!
12345678910Stream<Integer> integerStream = Lists.newArrayList(1, 2, 3).stream();// 求最大值integerStream.mapToInt(Integer::intValue).max();// 求最小值integerStream.mapToInt(Integer::intValue).min();// 求和integerStream.mapToInt(Integer::intValue).sum();
归约操作理解例如:一个Stream流进行累加
reduce接口参数以reduce最复杂的接口参数为例
1234567891011/*** 归约操作接口定义* @param identity - 初始值* @param accumulator - 计算逻辑* @param combine ...
Java单元测试之基类封装
在实际使用Spock的过程中如何把一些常用的测试方法抽出来,封装成基类使用。
BaseSpock在前面几篇文章讲解Spock结合Power Mock实现静态方法mock功能时,示例代码里经常会用到LogUtils等工具类的静态方法去记录日志,那我们就可以把LogUtils类的mock代码抽到一个公共类中,然后我们的测试类去继承我们自己实现的公共类
比如我们把公共类起名叫BaseSpock.groovy文件,那么继承它的子类就拥有了模拟LogUtils静态方法的功能,而不用每个测试类单独去实现mock LogUtils日志的功能
代码如下:
123456789101112131415161718192021222324252627package com.spock.exampleimport com.spock.example.utils.LogUtilsimport org.junit.runner.RunWithimport org.powermock.api.mockito.PowerMockitoimport org.powermock.core.classloader.anno ...
Java单元测试之动态Mock
在静态测试中,介绍了使用Power Mock测试静态方法,返回的是一个指定的值,那能不能每次返回不同的值呢?本篇介绍Spock自带的Mock功能如何和Power Mock组合使用。
动态Mock静态方法(Spock Where + Power Mock)看下什么场景需要这样做,代码如下:
123456789101112131415161718192021222324252627282930313233/** * 静态方法多分支场景 * * @param userVO 用户对象 * @return 返回订单对象List */public List<OrderVO> getUserOrdersBySource(UserVO userVO) { List<OrderVO> orderList = new ArrayList<>(); OrderVO order = new OrderVO(); // 手机来源 if ("APP".equals(HttpContextUtils.getCurrentSource())) { ...
Java之流式编程收集器
收集器简介
将流中的元素累积成一个结果
作用域终端操作collect()上
collect/Collector/Collectors
collect:作为终端操作出现的,流收集的最后一个步骤,一个方法
Collector:是一个接口,collect方法需要接收一个实现了Collector接口的收集器才可以收集
Collectors:是一个工具类,已经提前封装预制了一些实现了Collector接口的收集器,可以直接哪来用
常用预定义收集器功能
将流元素归约和汇总一个值
将流元素分组
将流元素分区
实战:预定义收集器案例集合收集器将流元素归约和汇总为一个值
1234567891011/** * 集合收集器 */@Testpublic void toList() { List<Sku> skus = CartService.getCartSKuList(); List<Sku> skuList = skus.stream() .filter(sku -> sku.getTotalPrice() > 1000) ...
Java单元测试之Spock静态测试
Spring单测实现原理Spock的单测代码是继承自Specification基类,而Specification又是基于Junit的注解Testable实现的
与早期版本,基于Junit4的注解@RunWith()实现,当前版本实现的@Testable注解,是Junit5平台式的注解,Junit5向下兼容Junit4,因此在测试时,Junit4的依然可以使用
PowerMock的PowerMockRunner也是继承自Junit,所以使用PowerMock的@PowerMockRunnerDelegate()注解可以指定Spock的父类Sputnik去代理运行Power Mock,这样就可以在Spock里使用PowerMock去模拟静态方法、final方法、私有方法等
其实Spock自带的GroovyMock可以对groovy文件的静态方法mock,但对Java代码的支持不完整,只能mock当前Java类的静态方法,官方给出的解释:https://spockframework.org/spock/docs/2.0/all_in_one.html#_mocking_static_met ...
Java单元测试之Spock void方法测试
void方法之前介绍的单元测试中的方法都是带有返回值,可以在then标签中验证返回结果,但是void方法时没有返回值的,就不能再then中验证返回结果。
一般来说无返回值的方法,内部逻辑会修改入参的属性值,比如参数是个对象,那代码里可能会修改它的属性值,虽然没有返回,但还是可以通过校验入参的属性来测试void方法
还有一种更有效的测试方式,就是验证方法内部逻辑和流程是否符合预期,比如:
应该走到哪个分支逻辑?
是否执行了这一行代码?
for循环中的代码执行了几次?
变量在方法内部的变化情况?
先看一个void方法的业务代码示例:
123456789101112131415161718/** * 根据汇率计算金额 * * @param userVO 用户信息 */public void setOrderAmountByExchange(UserVO userVO) { if (null == userVO.getUserOrders() || userVO.getUserOrders().size() <= 0) { return; } for ...
Java单元测试之Spock异常测试
背景有些方法需要抛出异常来中断或控制流程,比如参数校验的逻辑: 不能为null,不符合指定的类型,list不能为空等验证,如果校验不通过则抛出checked异常,这个异常一般都是我们封装的业务异常信息,比如下面的业务代码:
12345678910111213141516171819202122232425262728293031323334/** * 校验请求参数user是否合法 * * @param userVO 用户对象 * @throws ApiException 自定义业务对象 */public void validateUser(UserVO userVO) throws ApiException { if (userVO == null) { throw new ApiException("10001", "User is null"); } if (null == userVO.getName() || "".equals(userVO.getName())) { throw new ApiException("10002", ...