Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java EasyMock:如何在没有警告的情况下创建泛型类的模拟?_Java_Generics_Mocking_Easymock - Fatal编程技术网

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库进行编译。