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