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

时间:2008-09-11 15:49:10

标签: java generics mocking easymock

代码

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

给我一​​个警告“类型安全:SomeClass类型的表达式需要未经检查的转换以符合SomeClass&lt; Integer&gt;”。

5 个答案:

答案 0 :(得分:41)

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
}

答案 1 :(得分:11)

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

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

然后创建一个抽象类的模拟:

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

答案 2 :(得分:3)

两个明显的路由是禁止警告或模拟子类。

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

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

答案 3 :(得分:2)

您可以使用@SuppressWarnings("unchecked")注释测试方法。我同意这是一些黑客攻击,但在我看来,它在测试代码上是可以接受的。

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

答案 4 :(得分:1)

我知道这违背了这个问题,但为什么不创建一个List而不是模拟列表呢?

代码更少,更易于使用,例如,如果您想将项目添加到列表中。

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);