7

我编写了一个框架,增加了对其接口进行类型安全调用的可能性。现在,在编写 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

4 回答 4

2

在 JUnit 编译完成之前您不能运行 JUnit,这对于此检查来说为时已晚。

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

于 2013-01-09T13:17:17.783 回答
1

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

因为据我了解,您可以从您的 java 程序中调用他们的脚本(在您的情况下为 JUnit 测试)。

然而,最重要的问题是:

  • 它们是否支持完整的 java 语法/您对场景感兴趣的部分?
  • 有没有办法将当前类路径传播到执行的脚本?
于 2013-01-09T13:26:36.203 回答
1

其实你可以:

public static void assertCompilationError() {
    try {
          Integer name = (Integer)(Object)interface.getProperty(nameProp);
    } catch (Exception e) {
          //...
    }
} 
于 2013-01-09T14:01:25.127 回答
0

一段时间后,我发现了以下软件:

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

看起来应该可以进行某种破解,以便只编译有问题的块。现在,无论如何,我的示例不起作用,因为它还不支持泛型。

于 2013-01-28T08:01:09.057 回答