我编写了一个框架,增加了对其接口进行类型安全调用的可能性。现在,在编写 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)的通用解决方案,这样的解决方案也将受到欢迎。
在 JUnit 编译之前,您无法运行它,这对于此检查来说为时已晚。
您不能使用库来允许未编译的代码进行编译,以便您可以检查它是否未编译。
我很好奇你是否可以通过某种java脚本语言来实现这一点,我会详细检查beanshell和groovy,也许它们提供了你可以使用的东西。
因为据我了解,你可以从你的java程序调用他们的脚本(在你的例子中是JUnit测试)。
然而,最重要的问题是:
其实你可以:
public static void assertCompilationError() {
try {
Integer name = (Integer)(Object)interface.getProperty(nameProp);
} catch (Exception e) {
//...
}
}
过了一段时间,我发现了以下这个软件:
https://janino-compiler.github.io/janino/
看起来应该可以进行某种黑客攻击,以便仅编译有问题的块。无论如何,现在我的示例不起作用,因为它还不支持泛型。