gpt4 book ai didi

java - 如何实例化 TypeMirror

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:45:48 26 4
gpt4 key购买 nike

我有一个 AnnotationProcessor,它读取 spring webmvc 注释并根据它找到的内容生成代码。

代码运行良好,但我需要弄清楚如何对采用 javax.lang.model.type.TypeMirror 的方法进行单元测试作为参数并返回它的 String 类型表示,包括泛型(例如 java.util.Map<java.lang.String, java.util.List<java.lang.String>> 是一个示例,如果我将表示 TypeMirrorMap<String, List<String>> 作为参数传递,它将返回什么。

所以为了对这个方法进行单元测试(我的代码基于这个答案: Getting the qualified class name of generic type with Java 6 annotation processor ) 我想在单元测试期间模拟或创建一个 TypeMirror。

在我的实际代码中,我得到了 TypeMirror我需要使用 VariableElement.asType() ,但是运行调试器让我发现 VariableElement 的实际实现是一个核心 Java 类,而不是 api 的一部分: http://www.docjar.com/docs/api/com/sun/tools/javac/code/Symbol $VarSymbol.html

TypeMirror impl 是这样的,同样埋藏在 jdk 的非公开部分: http://www.docjar.com/docs/api/com/sun/tools/javac/code/Type $ClassType.html

我不想实例化内部 Java 类型 - 实例化 TypeMirror 的“正确”方法是什么? (或 VariableElement )?有没有人 mock 过一个可以给我举个例子的地方?

这是我要单元测试的方法:

private void typeToString(final TypeMirror type, final StringBuilder result,
final char innerClassSeparator) {
type.accept(new SimpleTypeVisitor7<Void, Void>() {
@Override
public Void visitDeclared(DeclaredType declaredType, Void v) {
TypeElement typeElement = (TypeElement) declaredType.asElement();
String rawType = rawTypeToString(typeElement, innerClassSeparator);
result.append(Util.getUnqualifiedClassName(rawType));
//java.lang.* is auto-included by the compiler for all classes
if (!rawType.startsWith("java.lang")) {
importTypes.add(rawType);
}
List<? extends TypeMirror> typeArguments = declaredType.getTypeArguments();
if (!typeArguments.isEmpty()) {
result.append("<");
for (int i = 0; i < typeArguments.size(); i++) {
if (i != 0) {
result.append(", ");
}
typeToString(typeArguments.get(i), result, innerClassSeparator);
}
result.append(">");
}
return null;
}

@Override
public Void visitPrimitive(PrimitiveType primitiveType, Void v) {
result.append(box((PrimitiveType) type).getName());
return null;
}

@Override
public Void visitArray(ArrayType arrayType, Void v) {
TypeMirror type = arrayType.getComponentType();
if (type instanceof PrimitiveType) {
result.append(type.toString()); // Don't box, since this is an array.
} else {
typeToString(arrayType.getComponentType(), result, innerClassSeparator);
}
result.append("[]");
return null;
}

@Override
public Void visitTypeVariable(TypeVariable typeVariable, Void v) {
result.append(typeVariable.asElement().getSimpleName());
return null;
}

@Override
public Void visitError(ErrorType errorType, Void v) {
// Error type found, a type may not yet have been generated, but we need the type
// so we can generate the correct code in anticipation of the type being available
// to the compiler.

// Paramterized types which don't exist are returned as an error type whose name is "<any>"
if ("<any>".equals(errorType.toString())) {
throw new CodeGenerationIncompleteException(
"Type reported as <any> is likely a not-yet generated parameterized type.");
}
result.append(errorType.toString());
return null;
}

@Override
protected Void defaultAction(TypeMirror typeMirror, Void v) {
result.append("void");
return null;
}
}, null);
}

最佳答案

对于一般情况,我会说“它是一个接口(interface),所以只需创建一个模拟”。对于这种情况,我认为您正在测试错误的接缝。

在这种情况下,真正的被测单元是您匿名声明的 SimpleTypeVisitor 实现。考虑到要真正测试整个 typeToString 方法,您必须验证您已实现的所有六个方法是否与其预期行为一致。因此,您应该将匿名实现提升为具体实现并测试这些方法。他们每个人都应该至少有一个测试,在这些测试中你可以模拟 typeToString 来处理你的递归调用。

关于java - 如何实例化 TypeMirror,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27554658/

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