最近在公司做需求,要求开发需要有相应的单元测试代码,第一次做单测相关的知识,就在这做一篇总结
一、JUnit
JUnit是Java最基础的测试框架,主要的作用就是断言。
方法名 | 方法描述 |
---|---|
assertEquals | 断言传入的预期值与实际值是相等的 |
assertNotEquals | 断言传入的预期值与实际值是不相等的 |
assertArrayEquals | 断言传入的预期数组与实际数组是相等的 |
assertNotNull | 断言传入的对象是不为空 |
assertFalse | 断言条件为假 |
assertSame | 断言两个对象引用同一个对象,相当于“==” |
assertThat | 断言实际值是否满足指定的条件 |
常用注解
注解名 | 含义 |
---|---|
@Test | 表示此方法为测试方法 |
@Before | 在每个测试方法前执行,可做初始化操作 |
@After | 在每个测试方法后执行,可做释放资源操作 |
@BeforeClass | 在类中所有方法前运行。此注解修饰的方法必须是static void |
@Parameters | 指定测试类的测试数据集合 |
@FixMethodOrder | 指定测试类中方法的执行顺序 |
@RunWith | 指定该测试类使用某个运行器 |
JUnit常用方法
我们测试下面这个简单的时间转换工具类,来说明一下具体的用法。
class DateUtil {
companion object {
// 英文全称 如:2017-11-01 22:11:00
val FORMAT_YMDHMS = "yyyy-MM-dd HH:mm:ss"
/**
* 掉此方法输入所要转换的时间输入例如("2017-11-01 22:11:00")返回时间戳
*
* @param time
* @return 时间戳
*/
@Throws(ParseException::class)
fun dateToStamp(time: String): Long {
val sdr = SimpleDateFormat(FORMAT_YMDHMS, Locale.CHINA)
val date = sdr.parse(time)
return date.time
}
/**
* 将时间戳转换为时间
*/
fun stampToDate(lt: Long): String {
val simpleDateFormat = SimpleDateFormat(FORMAT_YMDHMS, Locale.CHINA)
val date = Date(lt)
return simpleDateFormat.format(date)
}
}
}
我们发现预期值和实际结果不符合,测试失败
接下来测试dateToStamp方法,这里写两个断言方法
左下角这个绿色的勾勾就表示运行成功啦
测试异常
比如上述的dateToStamp()方法中,可能会抛出ParseException异常,我们可以验证是否抛出
验证一个方法是否抛出了异常,可以给@Test注解设置expected参数来实现
参数化测试
连续执行三次都成功(这里需要注意,每一次执行都是独立的,相互不影响)
二、Mockito
在实际的单元测试中,我们测试的类之间会有或多或少的耦合,导致我们无法顺利的进行测试,这时我们就可以使用Mockito,Mockito库能够Mock(我喜欢理解为模拟)对象,替换我们原先依赖的真实对象,这样我们就可以避免外部的影响,只测试本类,得到更准确的结果。
常用的Mock方式
class MockitoTest {
/**
* 方法1
*/
@Test
fun testIsNotNull() {
val person1