EasyMock: 如何创建一个泛型类的模拟对象而不出现警告?

45

代码

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

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

5个回答

42
据我所知,当涉及类名字面量时,无法避免未经检查的警告,并且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
}

12

我通过引入一个子类来解决这个问题,例如:

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

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

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

此外,在使用抽象类时,不要忘记使用 org.easymock.classextension.EasyMock 版本的 EasyMock 来创建模拟对象。 - Andreas
从EasyMock 3.0(2010年5月)开始,org.easymock.classextension中的类已被弃用,并且仅是指向org.easymock中同名类的简单代理。建议从导入中删除“.classextension”,并停止使用classextension库进行编译。 - AndrewF

3
两种明显的方法是抑制警告或模拟一个子类。
private static class SomeClass_Integer extends SomeClass<Integer>();
private SomeClass<Integer> someClass;
...
    someClass = EasyMock.createMock(SomeClass_Integer.class);

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


语法应该是:private static interface SomeClass_Integer extends SomeClass<Integer> {}我有同样的问题,这是我使用的解决方法,所以这种方法将起作用。但我希望有人能给出我们正在寻找的答案。 - Brian Matthews

2
你可以在测试方法上使用@SuppressWarnings("unchecked")进行注释。我认为这有点像一种hack,但在我的看法中,它在测试代码中是可以接受的。
@Test
@SuppressWarnings("unchecked")
public void someTest() {
    SomeClass<Integer> someClass = EasyMock.createMock(SomeClass.class);
}

2
是的,但那让我感觉很廉价。 - Kevin Wong
2
如果你选择这种方式(希望有更好的方法),最好将 @SuppressWarnings 放在变量赋值上,而不是整个方法上。 - SamBeran

1
我知道这与问题相反,但为什么不创建一个列表而不是模拟列表?
代码更少,更易于使用,例如如果您想向列表中添加项目。
MyItem myItem = createMock(myItem.class);
List<MyItem> myItemList = new ArrayList<MyItem>();
myItemList.add(myItem);

代替

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接