2015-07-13 68 views
3

我有需要的ArrayList作爲參數的類:如何進行單元測試代碼,應引起編譯錯誤

public class Foo { 
    private ArrayList<Bar> bars; 

    public Foo(ArrayList barList) { 
     bars = barList; 
    } 
} 

有我可以通過任何的ArrayList到構造函數中的錯誤:

// should compile error with this line 
Foo foo = new Foo(new ArrayList<String>()); 

問題是如果我將這個案例添加到測試套件中,當錯誤修復時,我無法編譯它。 有無論如何測試這種情況?

+0

爲錯誤添加單元測試以防止它們重新進行備份總是一個好主意。正如你似乎瞭解你自己,單元測試不應該檢查語法錯誤,所以我不會建議測試「類型正確性」或任何類型的東西。這就是爲什麼有一個編譯器。這個bug在生產中有一些不希望的效果。如何編寫一個更大規模的測試來揭示這個bug的症狀? – prgmtc

回答

3

我不知道任何語言/單元測試框架,可以讓你「測試」不應該編譯的代碼。如果你不能編譯它,沒有什麼可以測試的。但是,您可以在構建時打開所有編譯器警告。我非常確定,在JDK5之後的任何JVM中傳遞未參數化的集合都是一個很大的警告。

0

解決您的方法簽名:

public Foo(ArrayList<Bar> barList) { 
    bars = barList; 
} 

問題解決了。 (您可能還需要檢查空。)

+0

謝謝,但我知道如何解決它,我的問題是如何編寫單元測試,以防止再次發生相同的錯誤 – weiclin

+3

在這種情況下,Giovanni Botta的建議,以提高您的編譯器警告級別是正確的解決方案。單元測試用於測試運行時行爲。它們基本上是檢測應該是編譯器錯誤的錯誤工具。事實上,參數化類型信息在運行時會被刪除,所以單元測試在發生ClassCastException崩潰之前不可能檢測到它。 –

1

我覺得這是不好的做法,我實在看不出一個使用它,但看到這個例子對於如何測試編譯錯誤:

import static org.junit.Assert.assertTrue; 

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.junit.runners.JUnit4; 

@RunWith(JUnit4.class) 
public class CompileTest { 

    //A very naive way checking for any error 
    @Test(expected=java.lang.Error.class) 
    public void testForError() throws Exception { 
     this.is.not.a.statement; 
    } 

    //An example which check that we only find errors for regarding compilation errors. 
    @Test 
    public void expectNotCompilableMethod() { 
     try { 
      uncompilableMethod(); 
      fail("No compile error detected"); 
     } catch (Error e) { 
      assertTrue("Check for compile error message", e.getMessage().startsWith("Unresolved compilation problems")); 
     } 
    } 

    private void uncompilableMethod() { 
     do.bad.things; 
    } 
} 

編輯: 1)我不知道這可能與像mav​​en這樣的構建工具一起工作。據我所知,maven在編譯錯誤時破壞了構建,因此可能甚至不會執行測試。

+0

我用gradle構建代碼,它不能編譯,但是這是一個有趣的信息,謝謝 – weiclin