之前一篇博文(JUnit基礎及第一個單元測試實例(JUnit3.8))介紹了用JUnit做單元測試的基本方法,並寫了一個簡單的類Calculator,其中包含了整型加減乘除的簡單算法。
本文通過完善其中的除法和除法的單元測試來繼續說明JUnit的用法。
首先完善Calculator類中的除法,在除數為零的情況下拋出一個異常:
public int divide(int a, int b) throws Exception { if(0 == b) { throw new Exception("除數不能為0"); } return a / b; }
設計測試用例:
測試用例中不再拋出異常,而是使用try catch塊。
首先是測試正常情況的測試用例:
public void testDivide() { int result = 0; try { result = calculator.divide(12, 3); } catch (Exception e) { e.printStackTrace(); // 如果拋出異常,證明測試失敗,沒有通過,沒通過的測試計數在Failures中 Assert.fail(); // 如果不加這一行,如果程序進入到catch,無法判斷其失敗 } // 判斷方法的返回結果 Assert.assertEquals(4, result);// 第一個參數是期望值,第二個參數是要驗證的值 }
測試異常情況的測試用例:
public void testDivideByZero() { Throwable tx = null; int result = 0; try { result = calculator.divide(12, 2); Assert.fail("沒有拋出異常,測試失敗");// 如果執行到這行代碼,則證明沒有拋出異常,說明我們的驗證失敗 } catch (Exception e) { e.printStackTrace(); tx = e; } Assert.assertEquals(Exception.class, tx.getClass());// 拋出的異常類型是否和期望一致 Assert.assertEquals("除數不能為0", tx.getMessage());// 拋出的異常信息是否和期望一致 //如果上面兩個都通過,則測試通過 }
此代碼中故意將除數改為2,測試失敗。
除數為2時的執行情況:
總結:Assert.fail()加在期望中不可能到達的地方,一旦到達,表明測試失敗,結果與預期不同。
附上完整代碼:
目標類:

package com.mengdd.junit; public class Calculator { public int add(int a, int b) { return a + b; } public int subtract(int a, int b) { return a - b; } public int multiply(int a, int b) { return a * b; } public int divide(int a, int b) throws Exception { if(0 == b) { throw new Exception("除數不能為0"); } return a / b; } }
測試類:

package com.mengdd.junit; import junit.framework.Assert; import junit.framework.TestCase; public class CalculatorTest extends TestCase { private Calculator calculator = null; @Override public void setUp() throws Exception { System.out.println("set up"); // 生成成員變量的實例 calculator = new Calculator(); System.out.println(calculator); } @Override public void tearDown() throws Exception { System.out.println("tear down"); } public void testAdd() { int result = calculator.add(1, 2); // 判斷方法的返回結果 Assert.assertEquals(3, result);// 第一個參數是期望值,第二個參數是要驗證的值 } public void testSubtract() { int result = calculator.subtract(1, 2); // 判斷方法的返回結果 Assert.assertEquals(-1, result);// 第一個參數是期望值,第二個參數是要驗證的值 } public void testMultiply() { int result = calculator.multiply(2, 3); // 判斷方法的返回結果 Assert.assertEquals(6, result);// 第一個參數是期望值,第二個參數是要驗證的值 } public void testDivide() { int result = 0; try { result = calculator.divide(12, 3); } catch (Exception e) { e.printStackTrace(); // 如果拋出異常,證明測試失敗,沒有通過,沒通過的測試計數在Failures中 Assert.fail(); // 如果不加這一行,如果程序進入到catch,無法判斷其失敗 } // 判斷方法的返回結果 Assert.assertEquals(4, result);// 第一個參數是期望值,第二個參數是要驗證的值 } public void testDivideByZero() { Throwable tx = null; int result = 0; try { result = calculator.divide(12, 0); Assert.fail("沒有拋出異常,測試失敗");// 如果執行到這行代碼,則證明沒有拋出異常,說明我們的驗證失敗 } catch (Exception e) { e.printStackTrace(); tx = e; } Assert.assertEquals(Exception.class, tx.getClass());// 拋出的異常類型是否和期望一致 Assert.assertEquals("除數不能為0", tx.getMessage());// 拋出的異常信息是否和期望一致 //如果上面兩個都通過,則測試通過 } }
參考資料:
聖思園張龍老師Unit Test視頻。