如何断言表达式不能编译

时间:2013-01-09 12:55:28

标签: java junit

我编写了一个框架,增加了对其接口进行类型安全调用的可能性。现在,在编写JUnit测试时,我想表明编译器现在检查了早先导致运行时错误的特定表达式。

// this does not compile, because nameProp is of type Property<String>
Integer name = interface.getProperty(nameProp);

可能最好简单地将代码注释掉并保留原样。我只是想知道是否可以使用某些测试框架来编写类似

的内容
assertCompilationError() {
     Integer name = interface.getProperty(nameProp);
}

我明确地不希望自己使用自定义类路径调用javac。如果有可能将一般解决方案提取到框架代码(并捐赠给JUnit或TestNG),那么这种解决方案也会受到欢迎。

4 个答案:

答案 0 :(得分:2)

你不能运行JUnit,直到它编译为止这个检查为时已晚。

您不能使用库来允许编译的代码进行编译,以便检查它是否可以编译。

答案 1 :(得分:1)

如果你能通过一些java脚本语言实现这一点,我会很好奇,我会详细检查beanshell和groovy,也许它们会提供你可以使用的东西。

因为据我所知,你可以从java程序中调用它们的脚本(在你的情况下是JUnit测试)。

然而,最重要的问题是:

  • 他们是否支持完整的java语法/您对场景感兴趣的部分?
  • 有没有办法将当前的类路径传播到执行的脚本?

答案 2 :(得分:1)

其实你可以:

public static void assertCompilationError() {
    try {
          Integer name = (Integer)(Object)interface.getProperty(nameProp);
    } catch (Exception e) {
          //...
    }
} 

答案 3 :(得分:0)

过了一段时间,我找到了以下软件:

http://docs.codehaus.org/display/JANINO/Home

看起来应该可以做一些破解,以便只编译有问题的块。现在,我的例子无论如何都行不通,因为它还不支持泛型。