《Java单元测试实战》——案例集锦:Java单元测试典型案例集锦(1)

简介: 《Java单元测试实战》——案例集锦:Java单元测试典型案例集锦(1)

案例集锦:Java单元测试典型案例集锦


前言

 

近期,阿里巴巴CTO线卓越工程小组举办了阿里巴巴第一届单元测试比赛《这!就是单测》并取得了圆满成功。本人有幸作为评委,在仔细地阅读了各个小组的单元测试用例后,发现了两大单元测试问题:

 

无效验证问题:

 

不进行有效地验证数据对象、抛出异常和调用方法。

 

测试方法问题:

 

不知道如何测试某些典型案例,要么错误地测试、要么不进行测试、要么利用集成测试来保证覆盖率。比如:

 

错误地测试:利用测试返回节点占比来测试随机负载均衡策略;

不进行测试:没有人针对虚基类进行单独地测试;

利用集成测试:很多案例中,直接注入真实依赖对象,然后一起进行集成测试。

 

针对无效验证问题,在我的ATA文章《那些年,我们写过的无效单元测试》中,介绍了如何识别和解决单元测试无效验证问题,这里就不再累述了。在本文中,作者收集了一些的Java单元测试典型案例,主要是为了解决这个测试方法问题。

 

一、 如何测试不可达代码

 

在程序代码中,由于无法满足进入条件,永远都不会执行到的代码,我们称之为“不可达代码”。不可达代码的危害主要有:复杂了代码逻辑,增加了代码运行和维护成本。不可达代码是可以由单元测试检测出来的——不管如何构造单元测试用例,都无法覆盖到不可达代码。

 

 

 

1. 案例代码

 

在下面的案例代码中,就存在一段不可达代码。

 

/**
 * 交易订单服务类
 */
@Service
public class TradeOrderService {
    /** 注入依赖对象 */
    /** 交易订单DAO */
    @Autowired
    private TradeOrderDAO tradeOrderDAO;
    /**
     * 查询交易订单
     * 
     * @param orderQuery 订单查询
     * @return 交易订单分页
     */
    public PageDataVO<TradeOrderVO> queryTradeOrder(TradeOrderQueryVO orderQuery) {
        // 查询交易订单
        // 查询交易订单: 总共数量
        Long totalSize = tradeOrderDAO.countByCondition(orderQuery);
        // 查询交易订单: 数据列表
        List<TradeOrderVO> dataList = null;
        if (NumberHelper.isPositive(totalSize)) {
            List<TradeOrderDO> tradeOrderList = tradeOrderDAO.queryByCondition(orderQuery);
            if (CollectionUtils.isNotEmpty(tradeOrderList)) {
                dataList = convertTradeOrders(tradeOrderList);
            }
        }
        // 返回分页数据
        return new PageDataVO<>(totalSize, dataList);
    }
    /**
     * 转化交易订单列表
     * 
     * @param tradeOrderList 交易订单DO列表
     * @return 交易订单VO列表
     */
    private static List<TradeOrderVO> convertTradeOrders(List<TradeOrderDO> tradeOrderList) {
        // 检查订单列表
        if (CollectionUtils.isEmpty(tradeOrderList)) {
            return Collections.emptyList();
        }
        // 转化订单列表
        return tradeOrderList.stream().map(TradeOrderService::convertTradeOrder)
            .collect(Collectors.toList());
    }
    /**
     * 转化交易订单
     * 
     * @param tradeOrder 交易订单DO
     * @return 交易订单VO
     */
    private static TradeOrderVO convertTradeOrder(TradeOrderDO tradeOrder) {
        TradeOrderVO tradeOrderVO = new TradeOrderVO();
        tradeOrderVO.setId(tradeOrder.getId());
        // ...
        return tradeOrderVO;
    }
}

由于方法convertTradeOrders(转化交易订单列表)传入的参数tradeOrderList(交易订单列表)不可能为空,所以“检查订单列表”这段代码是不可达代码。

image.png

1. 方案1:删除不可达代码(推荐)

 

最简单的方法,就是删除方法convertTradeOrders(转化交易订单列表)中的不可达代码。

 

image.png


1. 方案2:利用不可达代码(推荐)

 

还有一种方法,把不可达代码利用起来,可以降低方法queryTradeOrder(查询交易订单)的代码复杂度。

 image.png

1. 方案3:测试不可达代码(不推荐)

 

对于一些祖传代码,有些小伙伴不敢删除代码。在某些情况下,可以针对不可达代码进行单独测试。

image.png



《Java单元测试实战》——案例集锦:Java单元测试典型案例集锦(2) https://developer.aliyun.com/article/1232057?groupCode=java

相关文章
|
6天前
|
设计模式 监控 Java
Java多线程基础-11:工厂模式及代码案例之线程池(一)
本文介绍了Java并发框架中的线程池工具,特别是`java.util.concurrent`包中的`Executors`和`ThreadPoolExecutor`类。线程池通过预先创建并管理一组线程,可以提高多线程任务的效率和响应速度,减少线程创建和销毁的开销。
27 2
|
2天前
|
搜索推荐 算法 Java
JAVA中的排序算法详解与实战
JAVA中的排序算法详解与实战
6 1
|
2天前
|
存储 Java 数据处理
Java中的循环结构语句详解与实战应用
Java中的循环结构语句详解与实战应用
7 2
|
2天前
|
Java 数据安全/隐私保护
Java中的选择结构语句详解与实战应用
Java中的选择结构语句详解与实战应用
9 2
|
2天前
|
Java
JAVA运算符详解与实战应用
JAVA运算符详解与实战应用
9 3
|
5天前
|
分布式计算 Java 测试技术
Spark 单元测试报Error:(26, 16) java: 程序包sun.misc不存在
Spark 单元测试报Error:(26, 16) java: 程序包sun.misc不存在
14 0
|
5天前
|
Java
Java中的多线程编程:从基础到实战
【5月更文挑战第29天】本文将深入探讨Java中的多线程编程,从基础概念到实际应用,为读者提供全面的指导。我们将首先介绍线程的基本概念和创建方法,然后讨论线程的生命周期、同步和通信机制。最后,我们将通过一个实际案例,展示如何在Java中实现多线程编程,以提高程序的性能和响应速度。
|
6天前
|
存储 Java 调度
Java多线程基础-11:工厂模式及代码案例之线程池(二)
这篇内容介绍了Java多线程基础,特别是线程池中的定时器和拒绝策略。
20 0
|
6天前
|
Java 调度
Java多线程基础-10:代码案例之定时器(二)
Java 多线程基础中,定时器(Timer)的实现通常使用 `PriorityBlockingQueue` 和 `wait/notify` 机制来管理任务。
15 0
|
19天前
|
监控 数据可视化 IDE
python自动化测试实战 —— 单元测试框架
python自动化测试实战 —— 单元测试框架