如何断言表达式无法编译

问题描述 投票:0回答:4

我编写了一个框架,增加了对其接口进行类型安全调用的可能性。现在,在编写 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)的通用解决方案,这样的解决方案也将受到欢迎。

java junit
4个回答
2
投票

在 JUnit 编译之前,您无法运行它,这对于此检查来说为时已晚。

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


1
投票

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

因为据我了解,你可以从你的java程序调用他们的脚本(在你的例子中是JUnit测试)。

然而,最重要的问题是:

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

1
投票

其实你可以:

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

0
投票

过了一段时间,我发现了以下这个软件:

https://janino-compiler.github.io/janino/

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

© www.soinside.com 2019 - 2024. All rights reserved.