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

代码

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

给我一个警告“types安全性:SomeClasstypes的expression式需要未经检查的转换符合SomeClass <Integer>”。

AFAIK,当涉及到类名字面值时,你不能避免未经检查的警告,而SuppressWarnings注释是处理这个问题的唯一方法。

请注意,尽可能缩小SuppressWarnings注释的范围是一种很好的forms。 您可以将此注释应用于单个局部variables分配:

 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 } 

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

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

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

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

两个明显的路线是压制警告或模拟一个子类。

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

(免责声明:甚至没有试图编译这个代码,也没有使用EasyMock。)

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

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

我知道这不符合这个问题,但为什么不创build一个列表,而不是一个模拟列表?

这是更less的代码,更容易处理,例如,如果你想添加项目的列表。

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