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

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

EasyMock: How do I create a mock of a genericized class without a warning?

编码

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

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


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

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

1
2
3
4
5
6
7
public void testSomething() {

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

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

或使用辅助方法:

1
2
3
4
5
6
7
8
9
10
@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
}

我通过引入一个子类来解决此问题。

1
private abstract class MySpecialString implements MySpecial<String>{};

然后创建该抽象类的模拟:

1
MySpecial<String> myMock = createControl().createMock(MySpecialString.class);


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

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

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


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

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

我知道这与问题背道而驰,但是为什么不创建列表而不是模拟列表呢?

例如,如果您要将项目添加到列表中,则代码更少,使用起来更容易。

1
2
3
MyItem myItem = createMock(myItem.class);
List<MyItem> myItemList = new ArrayList<MyItem>();
myItemList.add(myItem);

代替

1
2
3
4
5
MyItem myItem = createMock(myItem.class);
@SuppressWarnings("unchecked")
List<MyItem> myItemList = createMock(ArrayList.class);
expect(myItemList.get(0)).andReturn(myItem);
replay(myItemList);


推荐阅读