Java EasyMock:如何在没有警告的情况下创建泛型类的模拟?
代码Java EasyMock:如何在没有警告的情况下创建泛型类的模拟?,java,generics,mocking,easymock,Java,Generics,Mocking,Easymock,代码 private SomeClass<Integer> someClass; someClass = EasyMock.createMock(SomeClass.class); private SomeClass SomeClass; someClass=EasyMock.createMock(someClass.class); 给我一个警告“类型安全:类型SomeClass的表达式需要未经检查的转换才能符合SomeClass”。两个明显的途径是抑制警告或模拟子类 priva
private SomeClass<Integer> someClass;
someClass = EasyMock.createMock(SomeClass.class);
private SomeClass SomeClass;
someClass=EasyMock.createMock(someClass.class);
给我一个警告“类型安全:类型SomeClass的表达式需要未经检查的转换才能符合SomeClass”。两个明显的途径是抑制警告或模拟子类
private static class SomeClass_Integer extends SomeClass<Integer>();
private SomeClass<Integer> someClass;
...
someClass = EasyMock.createMock(SomeClass_Integer.class);
私有静态类SomeClass_Integer扩展了SomeClass();
私人某类某类;
...
someClass=EasyMock.createMock(someClass\u Integer.class);
(免责声明:我甚至没有尝试编译此代码,也没有使用EasyMock。)您可以使用
@SuppressWarnings(“未选中”)
对测试方法进行注释。我同意这是一个什么样的黑客,但在我看来,这是可以接受的测试代码
@Test
@SuppressWarnings("unchecked")
public void someTest() {
SomeClass<Integer> someClass = EasyMock.createMock(SomeClass.class);
}
@测试
@抑制警告(“未选中”)
公共测试(){
SomeClass-SomeClass=EasyMock.createMock(SomeClass.class);
}
AFAIK,当涉及类名文字时,您无法避免未检查的警告,而SuppressWarnings
注释是处理此问题的唯一方法
请注意,尽可能缩小SuppressWarnings
注释的范围是一种很好的形式。可以将此注释应用于单个局部变量赋值:
public void testSomething() {
@SuppressWarnings("unchecked")
Foo<Integer> foo = EasyMock.createMock(Foo.class);
// Rest of test method may still expose other warnings
}
public void testSomething(){
@抑制警告(“未选中”)
Foo-Foo=EasyMock.createMock(Foo.class);
//测试方法的其余部分仍可能暴露其他警告
}
或使用助手方法:
@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
}
@SuppressWarnings(“未选中”)
私有静态Foo createFooMock(){
return(Foo)EasyMock.createMock(Foo.class);
}
公共空间{
Foo-Foo=createFooMock();
//测试方法的其余部分仍可能暴露其他警告
}
我通过引入一个子类解决了这个问题,例如
private abstract class MySpecialString implements MySpecial<String>{};
私有抽象类MySpecialString实现MySpecial{};
然后创建该抽象类的模拟:
MySpecial<String> myMock = createControl().createMock(MySpecialString.class);
myspecialmymock=createControl().createMock(MySpecialString.class);
我知道这与问题背道而驰,但为什么不创建一个列表而不是模拟列表呢
例如,如果您想将项目添加到列表中,它的代码更少,也更易于使用
MyItem myItem = createMock(myItem.class);
List<MyItem> myItemList = new ArrayList<MyItem>();
myItemList.add(myItem);
MyItem-MyItem=createMock(MyItem.class);
List myItemList=新建ArrayList();
添加(myItem);
而不是
MyItem myItem = createMock(myItem.class);
@SuppressWarnings("unchecked")
List<MyItem> myItemList = createMock(ArrayList.class);
expect(myItemList.get(0)).andReturn(myItem);
replay(myItemList);
MyItem-MyItem=createMock(MyItem.class);
@抑制警告(“未选中”)
List myItemList=createMock(ArrayList.class);
expect(myItemList.get(0)).andReturn(myItem);
重播(myItemList);
语法应该是:私有静态接口SomeClass_Integer扩展SomeClass{}我也有同样的问题,这是我使用的解决方法,因此该方法将起作用。但是我希望有人能找到我们想要的答案是的,但是如果你走这条路(希望有更好的方法),我会觉得很便宜,在变量赋值上加@SuppressWarnings比在整个方法上加@SuppressWarnings更好。此外,在使用抽象类时,不要忘记使用easymock的org.easymock.classextension.easymock
版本来创建模拟。从easymock 3.0(2010年5月)起,org.easymock.classextension
中的类已被弃用,它们是org.easymock
中相同命名类的简单代理。建议从导入中删除“.classextension”,并停止使用classextension库进行编译。