单元测试基本方法

依照类型划分,单元测试方法可以划分为两大类。一类是针对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 条评论
登录 后参与评论

相关文章

来自专栏量化投资与机器学习

【精心解读】用pandas处理大数据——节省90%内存消耗的小贴士

本文我们讨论 pandas 的内存使用,展示怎样简单地为数据列选择合适的数据类型,就能够减少 dataframe 近 90% 的内存占用。

1.6K5
来自专栏李蔚蓬的专栏

第12周Python学习周记

>>> b = a                                #没有创建新的对象

692
来自专栏灯塔大数据

每周学点大数据 | No.43 相似连接的可扩展性

No.43期 相似连接的可扩展性 小可:那么具体是怎么做的呢? Mr. 王:我们先来看看求单元函数值是如何在 MapReduce 上实现的吧。 ? 图中有三...

3397
来自专栏丑胖侠

《Drools7.0.0.Final规则引擎教程》第4章 Query查询之基础

Query查询 首先,我们先来看一下query的语法结构图: ? Query语法提供了一种查询working memory中符合约束条件的FACT对...

2259
来自专栏软件开发 -- 分享 互助 成长

散列表(哈希表)

序言: 如果将一系列的记录按照关键字的某种函数存储,那么在查找某个数据的时候就可以直接通过关键字计算出来了,而不在需要“比较”,这样会非常高效,这就是散列技术。...

1768
来自专栏积累沉淀

hash算法原理详解

一.概念 哈希表就是一种以 键-值(key-indexed) 存储数据的结构,我们只要输入待查找的值即key,即可查找到其对应的值。 哈希的思路很简单,如果所有...

4075
来自专栏JMCui

策略模式.

    网上介绍设计模式的文章有很多,好文也不少。作为设计模式的初学者,实在不敢多加造次。就仅以此文作为我记忆的备忘录吧!

843
来自专栏云霄雨霁

关系代数

1280
来自专栏不会写文章的程序员不是好厨师

浅析LongAdder

上文中分析了AtomicLong以及Unsafe,本文将为大家带来LongAdder的分析.LongAdder之前在guava以及hystrix等中出现,但是目...

881
来自专栏青枫的专栏

Java中,局部内部类

局部内部类 A:局部内部类可以直接访问外部类的成员。 B:局部内部类在局部位置可以创建内部类对象,通过内部类对象调用内部类方法,来使用局部内部类功能。 ...

933

扫码关注云+社区