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

Kev*_*ong 43 java generics easymock mocking

代码

private SomeClass<Integer> someClass;
someClass = EasyMock.createMock(SomeClass.class);
Run Code Online (Sandbox Code Playgroud)

给我一个警告"类型安全:SomeClass类型的表达式需要未经检查的转换以符合SomeClass <Integer>".

Bar*_*end 41

AFAIK,当涉及类名文字时,您无法避免未经检查的警告,并且SuppressWarnings注释是处理此问题的唯一方法.

请注意,尽可能缩小SuppressWarnings注释范围是一种很好的形式.您可以将此批注应用于单个局部变量赋值:

public void testSomething() {

    @SuppressWarnings("unchecked")
    Foo<Integer> foo = EasyMock.createMock(Foo.class);

    // Rest of test method may still expose other warnings
}
Run Code Online (Sandbox Code Playgroud)

或使用辅助方法:

@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
}
Run Code Online (Sandbox Code Playgroud)


小智 12

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

private abstract class MySpecialString implements MySpecial<String>{};
Run Code Online (Sandbox Code Playgroud)

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

MySpecial<String> myMock = createControl().createMock(MySpecialString.class);
Run Code Online (Sandbox Code Playgroud)


Tom*_*ine 3

两个明显的途径是抑制警告或模拟子类。

private static class SomeClass_Integer extends SomeClass<Integer>();
private SomeClass<Integer> someClass;
...
    someClass = EasyMock.createMock(SomeClass_Integer.class);
Run Code Online (Sandbox Code Playgroud)

(免责声明:我什至没有尝试编译此代码,也没有使用 EasyMock。)