【助教】关于单元测试(二)

故事还在继续......

小张童鞋写的程序一直未报bug,这激发了他继续编程的兴趣,于是乎,他又写了个除法程序,说到除法,就不得不考虑的一种情况:

除数为零怎么办?
答:抛出异常。

所以,小张童鞋要解决两个问题:

  • 除数为零应该抛出什么异常?(让小李有思想准备来处理这种异常)
  • 用单元测试怎么测试这种异常?

为了解决第一个问题:

小张先写了一个最简单的版本:

package com.hui.demo;

public class Core {
	public int divide(int a, int b) {
		return a/b;
	}
}

想知道想知道报什么异常,调用一下就知道了,于是他写了一个main方法来调用他的除法程序,而且刻意让除数为零,观察Eclipse下报了什么错。

import com.hui.demo.Core;

public class T {
	public static void main(String[] args) {
		Core core = new Core();
		core.divide(3, 0);
	}
}

运行一下发现控制台报错:

Exception in thread "main" java.lang.ArithmeticException: / by zero
	at com.hui.demo.Core.divide(Core.java:5)
	at T.main(T.java:6)

所以第一个问题的答案是:java.lang.ArithmeticException
PS:关于这个异常,无论你百度谷歌必应搜狗,你都可以找到这个异常的意思是什么,即便是英文版的java的API:
http://docs.oracle.com/javase/8/docs/api/index.html
中对这个异常的英文描述,相信你都可以看得懂:

**Thrown when an exceptional arithmetic condition has occurred. For example, an integer "divide by zero" throws an instance of this class. **

所以,小张自热而然的把自己的程序处理成这样:

package com.hui.demo;

public class Core {
	public int divide(int a, int b) {
		if (0 == b) {
			// 除数为零,抛出异常
			throw new ArithmeticException();
		}
		return a/b;
	}
}

我们来解决第二个问题:
说到单元测试的情况,我们依然可以借用之前说的那句话:

// 我想测 一测:
// 参数传入
// 我的待测方法里面,
// 得出的结果会不会是:我期待的结果

// 我想测 一测:
// 0作为除数传入
// 我的除法方法里面,
// 得出的结果会不会是:抛出 java.lang.ArithmeticException异常

按照上一篇的方法建立单元测试:

package com.hui.demo.test;

import static org.junit.Assert.assertEquals;
import org.junit.Test;
import com.hui.demo.Core;

public class CoreTest {
        
        @Test
	public void testDivide() {
		Core core = new Core();
		int result = core.divide(3, 2);
		assertEquals(1, result);
	}
	
        @Test(expected=ArithmeticException.class)
	public void testDivideZero()  {
		Core core = new Core();
		core.divide(2, 0);
	}
}

这里重点看这句:

(expected=ArithmeticException.class)

的意思就是说:当我除数为0时候,我期待程序结果是:

抛出 ArithmeticException异常

运行这个测试方法,显示绿色条,这种情况测试通过。

小张开开心心的把写好的的除法程序给小李用,没想到,"噩梦"才刚刚开始......

原文地址:https://www.cnblogs.com/greyzeng/p/4443160.html