【问题标题】:Test if java-code does NOT compile测试 java 代码是否无法编译
【发布时间】:2014-07-12 14:00:43
【问题描述】:

这听起来可能有点奇怪,但我正在寻找一种可能性来测试代码中的某些语句是否被类型检查器拒绝(这意味着代码应该NOT 编译)。

解释一下我的意图:我正在对类型系统进行受控实验,我的受试者必须为我编写一些 java 方法。主题编写的方法的功能可以使用单元测试轻松测试,但我也希望方法类型良好(这意味着应该不允许允许某些方法调用)。 p>

我可以想象的一种方法是编写应该将构建分解为单独文件的语句,将其添加到类路径并运行 javac 以查看构建期间是否发生任何错误。虽然这可能有效,但感觉不是很复杂,所以我的问题是:有没有更好的方法来(自动)测试某些语句是否被类型检查器反映?

【问题讨论】:

    标签: java automated-tests static-typing


    【解决方案1】:

    这是Halting Problem 的变体,在一般情况下无法解决。为此,您必须运行(或在这种情况下编译)代码。因此,您已经提出的解决方案是最好的解决方案。

    【讨论】:

    • 编译代码不是问题。我可以随时编译代码(甚至运行它)。我正在寻找的是例如我可以添加到测试方法中的某种注释,它强制测试框架检查构建是否会中断,然后从编译中排除该方法(因为否则整个项目将不再编译)。
    • 如果没有实际构建,您无法测试构建是否会中断。这是由于停止问题中描述的属性。因此,如果您无论如何都必须构建它,只需检查构建是否失败,解析失败响应并采取适当的措施(例如,从测试工具代码中删除该方法)。
    【解决方案2】:

    你看过the Checker Framework吗?它可用于静态代码分析等。它可能非常适合您正在做的事情。这是我的答案中的link,带有注释类型处理器的示例。

    您也可能会发现the Java Compiler API 很有帮助。它允许在单个 java 机器上以编程方式执行 javac。因此,您可以将其用作测试的一部分。

    【讨论】:

    • Java 编译器 API 正是我所寻找的。谢谢! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    • 1970-01-01
    相关资源
    最近更新 更多