我正在为我的插件编写单元测试,它使用了JDT的IType和IMethod接口。要编写单元测试,我需要实例化这样的接口。回答 this question展示了如何创建AST模型,但我不知道如何将其转换为Java模型?
我的代码如下所示:
String source =
"package com.test\n" +
"\n" +
"import com.test.something;" +
"\n" +
"public class Class{\n" +
"int sum(int a, int b)\n" +
"}\n";
ASTParser parser = ASTParser.newParser(AST.JLS4);
parser.setSource(source.toCharArray());
CompilationUnit unit = (CompilationUnit) parser.createAST(null);
所以我有一个CompilationUnit
的实例,但是我需要一个ICompilationUInit实例,所以我可以访问IMethod
和IType
个对象。
答案 0 :(得分:2)
这实际上是不可能的。 ICompilationUnit
是java模型的一部分,这意味着它是某个Java项目的一部分,并且有一个完整的类路径,一个包,一个包根等等。你所做的就是创建一些解析树未连接到任何java项目的文本。
如果您可以更具体地了解您的目标是什么,那么您可能不需要任何IType和IMethod实例。
或者,如果您确实需要这些类型的实例,那么您将需要生成IProject
,为其添加java性质,然后使用文件填充它。您最好的选择是了解JDT测试基础架构的工作原理。
以及如何在整个测试框架中使用它。
答案 1 :(得分:1)
而不是设置ICompilationUnit
的实例您可以使用 AST访客模式访问方法声明节点& 输入声明节点并获取IMethod
和IType
个对象,如下所示:
compilationUnit.accept(new ASTVisitor() {
public boolean visit(MethodDeclaration node) {
IMethod iMethod = (IMethod) node.resolveBinding().getJavaElement();
return true;
}
public boolean visit(TypeDeclaration node) {
IType iType = (IType) node.resolveBinding().getJavaElement();
return true;
}
});
答案 2 :(得分:0)
根据https://www.eclipse.org/articles/article.php?file=Article-JavaCodeManipulation_AST/index.html,ASTRewrite
是可能的。我自己还没有尝试过,但是看起来很复杂。