EasyMock:如何在没有警告的情况下创建通用类的模拟?

时间:2020-03-05 18:51:37  来源:igfitidea点击:

代码

private SomeClass<Integer> someClass;
someClass = EasyMock.createMock(SomeClass.class);

给我一个警告"类型安全:类型SomeClass的表达式需要未经检查的转换才能符合SomeClass <Integer>"。

解决方案

回答

两条明显的途径是抑制警告或者模拟子类。

private static class SomeClass_Integer extends SomeClass<Integer>();
private SomeClass<Integer> someClass;
...
    someClass = EasyMock.createMock(SomeClass_Integer.class);

(免责声明:甚至没有尝试编译此代码,也没有使用过EasyMock。)

回答

我们可以使用@@ SuppressWarnings(" unchecked")注释测试方法。我同意这有点骇人听闻,但我认为测试代码可以接受。

@Test
@SuppressWarnings("unchecked")
public void someTest() {
    SomeClass<Integer> someClass = EasyMock.createMock(SomeClass.class);
}

回答

AFAIK,当涉及到类名文字时,我们不能避免未检查的警告,而" SuppressWarnings"注释是处理此问题的唯一方法。

注意,这是一种很好的形式,它可以尽可能地缩小" SuppressWarnings"注释的范围。我们可以将此注释应用于单个局部变量分配:

public void testSomething() {

    @SuppressWarnings("unchecked")
    Foo<Integer> foo = EasyMock.createMock(Foo.class);

    // Rest of test method may still expose other warnings
}

或者使用辅助方法:

@SuppressWarnings("unchecked")
private static <T> Foo<T> createFooMock() {
    return (Foo<T>)EasyMock.createMock(Foo.class);
}

public void testSomething() {
    Foo<String> foo = createFooMock();

    // Rest of test method may still expose other warnings
}