JAVA中的isMirror函数_java-如何实例化TypeMirror

我有一个AnnotationProcessor,它可以读取spring webmvc注释并根据发现的内容生成代码.

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

在我的实际代码中,我使用VariableElement.asType()获得了所需的TypeMirror,但是运行调试器使我发现VariableElement的实际实现是一个核心Java类,而不是api的一部分:

http://www.docjar.com/docs/api/com/sun/tools/javac/code/Symbol $VarSymbol.html

我宁愿不实例化内部Java类型-实例化TypeMirror(或VariableElement)的“正确”方法是什么?有人嘲笑他们可以给我一个例子吗?

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

private void typeToString(final TypeMirror type, final StringBuilder result,

final char innerClassSeparator) {

type.accept(new SimpleTypeVisitor7() {

@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 ""

if ("".equals(errorType.toString())) {

throw new CodeGenerationIncompleteException(

"Type reported as 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);

}

解决方法:

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

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

标签:unit-testing,annotation-processing,java

来源: https://codeday.me/bug/20191120/2047796.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值