单元测试基本方法

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

相关文章

来自专栏偏前端工程师的驿站

编译期类型检查 in ClojureScript

前言  话说"动态类型一时爽,代码重构火葬场",虽然有很多不同的意见(请参考),但我们看到势头强劲的TypeScript和Flow.js,也能感知到静态类型在某...

1907
来自专栏Spring相关

解决:Failed to convert value of type 'java.lang.String' to required type 'java.util.Date';的方法

9.6K2
来自专栏一个会写诗的程序员的博客

第9章 文件IO操作、正则表达式与多线程第9章 文件IO操作、正则表达式与多线程

我们在《第6章 扩展函数与属性》中已经介绍过Kotlin中的类扩展的特性。使用Kotlin的扩展函数功能,我们可以直接为 String 类实现一个 inc() ...

1123
来自专栏pangguoming

Proguard使用最新,最全教程,亲自试验

最近公司有一个项目,是外包项目,由于对方也有技术人员,出于技术上的保密,需要对class文件进行二次处理,于是网上找了好久,只发现Proguard是用的最广泛而...

4573
来自专栏程序猿DD

JDK 1.5 - 1.8 各版本的新特性总结

此文章意在借鉴前人经验,留作日后查看。如有侵犯,实属无意。我以后会注意,谢谢博友的提醒。也愿各大博友们能够共同学习和努力。

6766
来自专栏跟着阿笨一起玩NET

对Jquery+JSON+WebService的一点认识

Jquery作为一款优秀的JS框架,简单易用的特性就不必说了。在实际的开发过程中,使用JQ的AJAX函数调用WebService

1652
来自专栏ml

Guava------------Cache使用方法

    简单从这几个方面描述一下如何使用Cache,对Cache的各种原理介绍此处不涉及.     1.使用场景     2.如何使用Cache     3.创...

6768
来自专栏HansBug's Lab

1012: [JSOI2008]最大数maxnumber

1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MB Submit: 443...

2775
来自专栏java思维导图

总结:JDK1.5-JDK1.8各个新特性

作者:iwen-J | 链接:https://my.oschina.net/zhuqingbo0501/blog/1784693 JDK各个版本的新特性 以...

5687
来自专栏三好码农的三亩自留地

Java反射—写给自己的总结

上面反射是Oracle官方文档的定义,反射能够突破访问权限控制,这还是很优秀的,但是,问题来了,为什么需要反射或者说什么情况下需要用反射?

1562

扫码关注云+社区