如何 EasyMock 对返回通配符泛型的方法的调用?

Posted

技术标签:

【中文标题】如何 EasyMock 对返回通配符泛型的方法的调用?【英文标题】:How to EasyMock a call to a method that returns a wildcarded generic? 【发布时间】:2010-07-15 19:13:21 【问题描述】:

我们正在考虑切换到 Spring 3.0,但遇到了 Spring 3.0、EasyMock 和 Java 泛型的交集问题。

在一个地方,我们模拟了一个 Spring 3.0 AbstractBeanFactory,特别是这个方法:

public Class<?> getType(String name) throws NoSuchBeanDefinitionException  ... 

在 Spring 的早期版本中,这会返回一个非泛型并且一切正常。然而,对于泛型,我们遇到了麻烦:

expect(mockBeanFactory.getType(CLASS_NAME)).andReturn(SOME_CLASS);

因为getType 返回Class&lt;?&gt;andReturn 需要Class&lt;?&gt; 作为参数,这根本无法正常工作。

是否有已知的解决方法?

【问题讨论】:

这不会返回警告吗? 【参考方案1】:

我以前在使用 Mockito 时遇到过类似的问题。我不确定它为什么会发生。您可以将 expect(..) 参数转换为非泛型 Class 类型,ala

expect((Class) mockBeanFactory.getType(CLASS_NAME)).andReturn(SOME_CLASS);

然后你只会得到一个警告,如果你愿意,你可以取消它。不是一个非常优雅的解决方案;我打算再花几分钟看一下。

【讨论】:

这样就行了。可悲的是,在处理 Java 泛型时,我开始期待不优雅的解决方案。 +1 给你们俩。 @AlanKrueger - 我不能 +1 这个足够了。我花了 20 分钟 只是想弄清楚如何搜索这个问题 :P 我对为什么会发生这种情况的猜测是,Java 无法确定从 EasyMock 的 expects() 返回的通配符类型是否与从 @987654323 返回的通配符类型相同@。在实现中,编译器只需要处理一个通配符:方法的返回类型。 EasyMock 的设置方式,需要有两个通配符:预期返回类型和实际返回类型。当每种类型都有通配符时,【参考方案2】:

避免任何强制转换和警告的最简单方法是使用expectLastCall() 而不是expect(..)(有关详细信息,请参阅my answer to a similar question)。

所以在这种情况下:

mockBeanFactory.getType(CLASS_NAME);
expectLastCall().andReturn(SOME_CLASS);

【讨论】:

以上是关于如何 EasyMock 对返回通配符泛型的方法的调用?的主要内容,如果未能解决你的问题,请参考以下文章

Java泛型和内部类

《JavaSE 基础知识》泛型的基本介绍和应用。

Java泛型简介定义和使用含有泛型的类定义和使用含有泛型的方法定义和使用含有泛型的接口泛型通配符?受限泛型

C#如何将类型Type作为泛型T的参数T传递

Java重点--泛型

详解Java泛型