Exception testing

微微微笑發表於2015-07-11

怎樣去驗證程式碼是否丟擲我們期望的異常呢?雖然在程式碼正常結束時候驗證很重要,但是在異常的情況下確保程式碼如我們希望的執行也很重要。比如說:

new ArrayList<Object>().get(0);

這句程式碼會丟擲一個IndexOutOfBoundsException異常。有三種方法來驗證ArrayList是否丟擲了正確的異常。

1. @Test 裡面加上一個引數"expected"。(參見test01)

謹慎使用expected引數。方法裡的任意程式碼丟擲IndexOutOfBoundsException異常都會導致該測試pass。複雜的測試建議使用 ExpectedException 規則。

2.Try/Catch(參見test02)

方法1僅僅適用於簡單的例子,它有它的侷限性。比如說,我們不能測試異常的資訊返回值,或者異常丟擲之後某個域物件的狀態。對於這種需求我們可以採用JUnit 3.x流行的 try/catch 來實現。

3.ExpectedException 規則(參見test03)

該規則不僅可以測試丟擲的異常,還可以測試期望的異常資訊。

 

import static org.junit.Assert.*;  
import static org.hamcrest.CoreMatchers.*;  
import java.util.ArrayList;  
import java.util.List;  
import org.junit.Rule;  
import org.junit.Test;  
import org.junit.rules.ExpectedException;  
  
public class ExceptionTest {  
      
    @Test(expected=IndexOutOfBoundsException.class)  
    public void test01(){  
        new ArrayList<Object>().get(0);  
    }  
      
    @Test()  
    public void test02(){  
        try{  
            new ArrayList<Object>().get(0);  
            fail("Expected an IndexOutOfBoundsException to be thrown");  
        }catch(IndexOutOfBoundsException e){  
            assertThat(e.getMessage(),is("Index: 0, Size: 0"));  
        }  
    }  
      
    @Rule  
    public ExpectedException thrown=ExpectedException.none();  
      
    @Test  
    public void test03() throws IndexOutOfBoundsException{  
        List<Object> list=new ArrayList<Object>();  
        thrown.expect(IndexOutOfBoundsException.class);  
        thrown.expectMessage("Index: 0, Size: 0");  
        list.get(0);  
    }  
} 

 

相關文章