【问题标题】:How to EasyMock a call to a method that returns a wildcarded generic?如何 EasyMock 对返回通配符泛型的方法的调用?
【发布时间】: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; 作为参数,这根本无法正常工作。

是否有已知的解决方法?

【问题讨论】:

  • 这不会返回警告吗?

标签: java spring generics wildcard easymock


【解决方案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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 2019-09-22
    • 1970-01-01
    相关资源
    最近更新 更多