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

Posted

技术标签:

【中文标题】EasyMock:如何在没有警告的情况下创建泛型类的模拟?【英文标题】:EasyMock: How do I create a mock of a genericized class without a warning? 【发布时间】:2010-09-08 14:07:53 【问题描述】:

代码

private SomeClass<Integer> someClass;
someClass = EasyMock.createMock(SomeClass.class);

给我一​​个警告“类型安全:SomeClass 类型的表达式需要未经检查的转换才能符合 SomeClass”。

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

private abstract class MySpecialString implements MySpecial<String>;

然后创建该抽象类的模拟:

MySpecial<String> myMock = createControl().createMock(MySpecialString.class);

【讨论】:

另外,在使用抽象类时不要忘记使用 org.easymock.classextension.EasyMock 版本的 EasyMock 来创建模拟。 从 EasyMock 3.0(2010 年 5 月)开始,org.easymock.classextension 中的类已被弃用,它们是 org.easymock 中同名类的简单代理。建议从您的导入中删除“.classextension”并停止使用类扩展库进行编译。【参考方案3】:

两条明显的路线是抑制警告或模拟子类。

private static class SomeClass_Integer extends SomeClass<Integer>();
private SomeClass<Integer> someClass;
...
    someClass = EasyMock.createMock(SomeClass_Integer.class);

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

【讨论】:

语法应该是: private static interface SomeClass_Integer extends SomeClass 我有同样的问题,这是我使用的解决方法,因此该方法将起作用。但我希望有人能找到我们正在寻找的答案【参考方案4】:

您可以使用@SuppressWarnings("unchecked") 注释测试方法。我同意这有点像 hack,但我认为它在测试代码上是可以接受的。

@Test
@SuppressWarnings("unchecked")
public void someTest() 
    SomeClass<Integer> someClass = EasyMock.createMock(SomeClass.class);

【讨论】:

是的,但这让我觉得自己很廉价 如果你走这条路(希望有更好的方法),最好将@SuppressWarnings 放在变量赋值而不是整个方法上。【参考方案5】:

我知道这与问题不符,但为什么不创建一个列表而不是模拟列表呢?

它的代码更少,更易于使用,例如,如果您想将项目添加到列表中。

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

【讨论】:

以上是关于EasyMock:如何在没有警告的情况下创建泛型类的模拟?的主要内容,如果未能解决你的问题,请参考以下文章

Java泛型:泛型类泛型接口和泛型方法

泛型

Java泛型知识点:泛型类泛型接口和泛型方法

Java泛型:泛型类泛型接口和泛型方法

Java泛型类

JAVA中的泛型类是啥东西?