gpt4 book ai didi

java - 在 IntelliJ IDEA 中,测试如何访问正在测试的代码的 PSI 树结构?

转载 作者:行者123 更新时间:2023-12-01 11:19:36 31 4
gpt4 key购买 nike

从 IntelliJ IDEA IDE 运行测试,我希望他们能够对正在测试的代码进行一些自定义静态分析。为此,我希望测试能够访问被测试代码的PSI 树结构。这可能吗?怎么办?

这里是一个说明其有用性的示例:在 Hibernate 中,实体类的 final 方法不应直接访问任何字段。因此,我想编写一个测试来检查所有用 @Entity 注释的类是否没有引用字段的 final方法。这是我无法通过反射(reflection)做到的。我需要访问 PSI 树。这只是一个示例,此类功能还有更多用例。

我知道这会将测试与 IntelliJ IDEA 结合起来。我知道我可以编写一个 IntelliJ IDEA 插件来实现“检查”来进行此类分析。但我想把它写成测试。测试可以是红色或绿色。可以发出有意义的错误消息的测试。可以运行代码、通过反射访问代码以及访问 PSI 树的测试。

最佳答案

您要做的基本上是处理解析器输出的 AST,因此一种方法是编写扩展 ParsingTestCase 的单元测试。此类测试的初始行为是打印 AST 的可读版本并将其与预期文件进行比较,但您可以重写方法来执行完全不同的测试,同时保持简单的方法检索 PSI 树:

import com.intellij.testFramework.ParsingTestCase;

public class MyAwesomeTest extends ParsingTestCase {

public MyAwesomeTest() {
super("relative/path/to/files", "java", new JavaParserDefinition());
}

@Override
protected boolean skipSpaces() {
return true;
}

public void testEmpty() {
doTest(true); // this will test relative/path/to/files/Empty.java
}

@Override
protected void checkResult(@NonNls @TestDataFile String targetDataName, final PsiFile file) throws IOException {
// do your stuff here
}

}

请注意,文件名是从测试方法名称中提取的(此处为空),如果您想测试大量文件,这可能会很烦人,尤其是当它们的名称仅在运行时已知时。为了克服这个问题,您可以将 doTest() 替换为自定义方法,该方法通过附加 name 参数执行类似的操作。

然后,要运行这些测试,您必须下载 IntelliJ(Ultimate 或 Community)并将位于 Intellij/lib/ 中的一堆 Jar 文件添加到您的类路径中。否则,可能可以在 IntelliJ 的 headless 模式下运行单元测试,但我不知道如何运行。

此处的其他信息:https://confluence.jetbrains.com/display/IDEADEV/Testing+IntelliJ+IDEA+Plugins

关于java - 在 IntelliJ IDEA 中,测试如何访问正在测试的代码的 PSI 树结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31404292/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com