编码
private SomeClass<Integer> someClass;
someClass = EasyMock.createMock(SomeClass.class);
给我一个警告“类型安全:SomeClass 类型的表达式需要未经检查的转换才能符合 SomeClass<Integer>”。
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
}
我通过引入一个子类来解决这个问题,例如
private abstract class MySpecialString implements MySpecial<String>{};
然后创建该抽象类的模拟:
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")
。我同意这有点像 hack,但我认为它在测试代码上是可以接受的。
@Test
@SuppressWarnings("unchecked")
public void someTest() {
SomeClass<Integer> someClass = EasyMock.createMock(SomeClass.class);
}
我知道这违背了这个问题,但为什么不创建一个列表而不是一个模拟列表呢?
它的代码更少且更易于使用,例如,如果您想将项目添加到列表中。
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);