单元测试基本方法

依照类型划分,单元测试方法可以划分为两大类。一类是针对public方法进行测试,另一类是针对private方法进行测试。

public方法测试

public方法和public static方法均属于public方法。public方法单元测试较简单。可分为需要Mock型和不需要Mock型。

需要Mock型public方法单元测试可类似于Spring Service层测试

不需要Mock型public方法单元测试可以直接构建输入数据通过Junit工具校验程序运行结果,示例如下:

import com.alibaba.fastjson.JSON;
import com.agoura.model.util.FileUtils;
import com.agoura.model.util.Junit4ClassRunner;
import com.agoura.model.utils.FileIOUtils;
import com.agoura.model.utils.JsonUtil;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;

import java.lang.reflect.Method;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import static org.junit.Assert.assertEquals;

@RunWith(Junit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath*:spring-mybatis.xml"})
public class SimpleTest {
    private Simple simple = new Simple();

    @Before
    public void before() throws Exception {
    }

    @After
    public void after() throws Exception {
    }

    @Test
    public void testModel() {
        List<String> testData = FileIOUtils.readlines("/Simple/测试数据.txt");
        List<String> results = new LinkedList<>();
        for (String str : testData) {
            simple = new Simple();
            simple.init(new DataFormat(JSON.parseObject(str).getJSONObject("data")));
            Map<String, Object> result = simple.getResult();
            results.add(JSON.parseObject(JSON.toJSONString(result)).toJSONString());

            Map<String, Object> resultForCompany = simple.getResultForCompany();
            results.add(JsonUtil.toJSON(resultForCompany).toJSONString());
        }
        List<String> expect = FileIOUtils.readlines("/Simple/测试结果.txt");
        for (int i = 0; i < results.size(); i++) {
            assertEquals(expect.get(i), results.get(i));
        }
    }
}

private方法测试

private方法是类内部方法,不能直接在外部调用。对private方法进行测试时需要想办法将其变为可以在外部进行调用。利用反射机制刚好可以实现对被测试类中private方法进行调用。具体代码示例如下:

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;

import java.lang.reflect.Method;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import static org.junit.Assert.assertEquals;

@RunWith(Junit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath*:spring-mybatis.xml"})
public class SimpleTest {
    private Simple simple = new Simple();

    @Before
    public void before() throws Exception {
    }

    @After
    public void after() throws Exception {
    }

    /**
     * Method: getLimit(int score1, Integer score2)
     */
    @Test
    public void testGetLimit() throws Exception {
        try {
            Method method = Simple.class.getDeclaredMethod("getLimit", Integer.class, Integer.class);       //反射得到被测试方法
            method.setAccessible(true);         //将被测试方法设置为可调用
            int limit = (int) method.invoke(simple, null, 0);
            assertEquals(0, limit);
            limit = (int) method.invoke(simple, 600, null);
            assertEquals(0, limit);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
} 

小结

虽然无论是public方法还是private方法都可以对其进行测试,但是public方法测试更为简单便利,所以尽量减少对private方法进行测试。

在开发过程中尽量对方法进行细分,将一个方法合理细分成多个方法,一般按照功能划分,使每个方法功能都尽量简单单一。这样测试时构造数据也相对较容易,便于对单一功能方法进行测试。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏华仔的技术笔记

iOS中的正则表达式,一篇就够了

35710
来自专栏编程坑太多

数据结构之基于Java的最优二叉树实现

1352
来自专栏WindCoder

《简明 Python 教程》学习笔记- 基本概念

最近除了忙着论坛那边,就是忙着攻克Python,都好久没来更新了。今天暂且发出一小部分之前自学时做的笔记吧。假期忽然对脚本语言产生了兴趣,最终选择了这个先学着(...

391
来自专栏服务端技术杂谈

dubbo源码学习笔记----结合Spring

dubbo结合spring public class ServiceBean<T> extends ServiceConfig<T> implements In...

26010
来自专栏鸿的学习笔记

Python写的Python解释器(七)--完结篇

在程序运行时,只会创建一次VirtualMachine实例,这是因为只有一个Python解释器。 VirtualMachine存储着call stack,异常状...

743
来自专栏李成熙heyli

babel到底将代码转换成什么鸟样?

前言 将babel捧作前端一个划时代的工具一定也不为过,它的出现让许多程序员幸福地用上了es6新语法。但你就这么放心地让babel跑在外网?反正我是不放心,我就...

31610
来自专栏守候书阁

实例感受-es6的常用语法和优越性

前几天,用es6的语法重写了我的一个代码库,说是重写,其实改动的并不多,工作量不大。在重写完了的时候,就个人总结了一下es6常用的一些常用的语法和比es5优越的...

563
来自专栏烂笔头

Python标准库笔记(3) — datetime模块

目录[-] datetime模块提供了简单和复杂的方式用于操纵日期和时间的类。虽然支持日期和时间运算,但实现的重点是为了输出格式化和操作高效地提取属性。 ...

3556
来自专栏编程

记住这35个大神级别的Python操作,足够精简上千行代码!

从我开始学习python的时候,我就开始自己总结一个python小技巧的集合。后来当我什么时候在Stack Overflow或者在某个开源软件里看到一段很酷代码...

2317
来自专栏尾尾部落

[剑指offer] 二进制中1的个数

如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后...

802

扫码关注云+社区