2015-07-13 20 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

相关问题