Java 如何断言表达式不编译

Java 如何断言表达式不编译,java,junit,Java,Junit,我已经编写了一个框架,它增加了对其接口进行类型安全调用的可能性。现在,在编写JUnit测试时,我想说明编译器现在检查以前导致运行时错误的特定表达式 // this does not compile, because nameProp is of type Property<String> Integer name = interface.getProperty(nameProp); 我明确地不想自己用自定义类路径来处理javac的调用。如果有可能将一个通用的解决方案提取到框架代码中

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

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

我明确地不想自己用自定义类路径来处理javac的调用。如果有可能将一个通用的解决方案提取到框架代码中(并捐赠给JUnit或TestNG),那么这样的解决方案也是受欢迎的。

在JUnit编译之前,您不能运行它,这对于此检查来说太晚了


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

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

因为据我所知,您可以从java程序中调用它们的脚本(在您的例子中是JUnit测试)

然而,最重要的问题是:

  • 它们是否支持完整的java语法/您对场景感兴趣的部分
  • 是否有方法将当前类路径传播到已执行的脚本
实际上,您可以:

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

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


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

但编写JUnit代码本身意味着遵循Java标准。因此JUnit类应该编译。对吗?因此,据我所知,您可能必须深入研究javac调用。确切地说,类本身应该编译。我只想断言一个特定的表达式是不可编译的。你看过了吗?也许你可以使用它?@sorencito:如果类包含“不可编译的特定表达式”,则该类将不会编译@jlordo:你已经知道了-这就是我为什么要问的原因。我想我需要将一个java文件放入一个资源文件夹中,并尝试从那里编译它。+1在这种情况下,类加载器将抛出
compileationerror
。因此,在本例中,您只需确保每个试图通过groovy/beanshell调用的类/脚本都有一个测试,而不是每个方法都有一个测试!并且适用于示例:-)不幸的是,它没有100%正确地回答这个问题,因为它是关于检测编译时错误的。此外,由于类型擦除,它对类型集合不起作用。@Sorencito这对您的示例如何起作用?您的财产的非通用版本也会通过测试(带有ClassCastException)。@sorencito,我完全同意。你可以认为这是一种玩笑,因为,当然,它不能涵盖所有的情况,只有你在你的问题中提到的:“阿西利亚斯是对的。”这也是我在发表评论后的想法:-)无论如何,使用双重强制转换是一种有趣的解决方案……正如jlordo评论的那样,我可以使用编译器API自己编译代码。所以,至少我能够用Java代码编写字符串并编译它们。
public static void assertCompilationError() {
    try {
          Integer name = (Integer)(Object)interface.getProperty(nameProp);
    } catch (Exception e) {
          //...
    }
}