如何 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<?>
,andReturn
需要Class<?>
作为参数,这根本无法正常工作。
是否有已知的解决方法?
【问题讨论】:
这不会返回警告吗? 【参考方案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 对返回通配符泛型的方法的调用?的主要内容,如果未能解决你的问题,请参考以下文章