概述
我们在开发过程中,为了代码的稳定性也好,为了少给自己以后的开发挖坑也好,多写单元测试绝对是一件性价比超高的繁琐事,既然是繁琐的事情,我想大部分人是不愿意写的,我也不愿意写,但是要做好一个程序员,不仅仅的去做一个低级码农,那就从最简单的地方做起,单元测试就是一件特别简单的事。写了单元测试的代码的健壮性和逻辑性绝对要更上一个层次,而且对于开发而言理解回顾代码逻辑是一件必不可少的事情
一个 bug 被隐藏的时间越长,修复这个 bug 的代价就越大。前期多去写一些边界测试,后期就有时间学习,开发时间和回归回顾时间的比例应该是1:1,单元测试是一个方法层面上的测试,也是最细粒度的测试。用于测试一个类的每一个方法都已经满足了方法的功能要求,可以避免测试点的遗漏,为了更好的进行测试,可以提高测试效率。在开发中,对于自己开发的模块,只有在通过单元测试之后,才能提交到 SVN 库 或者 Git 库。
工具
我将在下面介绍下PowerMockRunner和SpringRunner两个单元测试的运行环境。
SpringRunner
SpringRunner 继承了SpringJUnit4ClassRunner,SpringRunner是SpringJUnit4ClassRunner的一个别名,没有扩展任何功能。下面我们来看下示例
package com.hly.unitest.controller;
import com.alibaba.fastjson.JSON;
import com.hly.unitest.entity.UserInfo;
import com.hly.unitest.service.UserService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceNoMockTest {
@Autowired
private UserService userService;
@Test
public void getUser() throws Exception {
UserInfo result = userService.getUser("6f49aa9e-1afc-4439-ad21-25ae90dde566");
System.out.println("the 1st time: result = " + JSON.toJSONString(result));
}
}
返回显示:
分析:
首先我们分析下注解:
@RunWith: 用于指定junit运行环境,是junit提供给其他框架测试环境接口扩展,为了便于使用spring的依赖注入,spring提供了org.springframework.test.context.junit4.SpringJUnit4ClassRunner作为JUnit测试环境。在JUnit中有很多个Runner,他们负责调用你的测试代码,每一个Runner都有各自的特殊功能,你要根据需要选择不同的Runner来运行你的测试代码。我们此篇文章只探讨SpringRunner和PowerMockRunner。
@SpringBootTest: 替代了spring-test中的@ContextConfiguration注解,目的是加载ApplicationContext