如何返回我明确作为参数传递的类型?

时间:2013-07-15 15:11:55

标签: java generics types hamcrest

我想将一个类型存储为参数,但是当我返回它并在JUnit测试中检入时,我会得到类似

的内容
Expected: an instance of Java.lang.String
but: <class java.lang.String> is a java.lang.class

这是班级的最小化例子......

public class ContextVariableResult<T> {
    private Class<T> type;

    public ContextVariableResult(Class<T> type) {
        this.type = type;
    }

    //TODO doesn't work
    public Class<T> getType() {
        return type;
    }
}

我传递 String.class 作为构造函数参数。

我的测试看起来像这样......

assertThat(result.getType(), instanceOf(String.class));

我认为我的hamcrest匹配器错误,但由于编译错误,我无法使用 is(String.class) isA(String.class)

 The method assertThat(T, Matcher<? super T>) in the type Assert is not applicable for the arguments (Class<capture#3-of ?>, 
     Matcher<String>)

我已经尝试返回反射对象类型,我也尝试强制转换为 ParameterizedType ,但后来我得到了ClassCastExceptions等等。

我希望方法结果为“String”。我错了什么?如果我不需要传递参数“String.class”会好得多,但我认为我总是会遇到类型擦除问题。

2 个答案:

答案 0 :(得分:6)

您正在检查返回值是字符串的实例,例如"hello"。但是您的方法返回类String,即String.class

我猜你的方法会返回你想要的东西。在这种情况下,您甚至没有使用hamecrest进行验证。常规JUnit的{​​{1}}将适合您。

答案 1 :(得分:4)

你写的课很好。您的测试不正确,因为Class<String>不是String的实例。改变断言:

assertThat(result.getType(), is(String.class));
// or
assertEquals(String.class, result.getType());