单元测试 – 使用Spring注入EasyMock模拟会导致ClassCastException

我试图让Spring在我的单元测试中注入EasyMock模拟.

在我的applicationContext.xml中,我有这个:

<bean id="mockService"  class="org.easymock.EasyMock" factory-method="createMock"  name="MockService">
    <constructor-arg index="0" value="my.project.Service"/>
</bean>

在我的单元测试中我有这个:

@Autowired
@Qualifier("mockService")
private Service service;

public void testGetFoo() {
    Foo foo = new Foo();

    expect(service.findFoo()).andReturn(foo);
    replay(service); // <-- This is line 45, which causes the exception

    // Assertions go here...
}

当我尝试运行我的测试时,我得到了这个堆栈跟踪:

java.lang.ClassCastException: org.springframework.aop.framework.JdkDynamicAopProxy
at org.easymock.EasyMock.getControl(EasyMock.java:1330)
at org.easymock.EasyMock.replay(EasyMock.java:1279)
at TestFooBar.testGetFoo(TestVodServiceLocator.java:45)

我对Spring和EasyMock都很陌生,但在我看来,错误是由EasyMock试图调用一个假定为EasyMock实例的方法引起的,但实际上是Spring创建的动态代理.据我了解,动态代理只实现接口中定义的方法,在本例中是Service的接口.

我不明白的是from what I read(也是here),我想要达到的目标至少似乎是可能的.

所以我的问题是:我不做什么或做错了什么?

解决方法:

您还可以创建一个帮助方法,从Spring代理中解包EasyMock代理,以定义预期的行为:

public static <T> T unwrap(T proxiedInstance) {
  if (proxiedInstance instanceof Advised) {
    return unwrap((T) ((Advised) proxiedInstance).getTargetSource().getTarget());
  }

  return proxiedInstance;
}

请注意重复调用,因为在最坏的情况下,您有多个代理程序围绕实际目标.

上一篇:python2.7连接hive(使用impyla)环境搭建


下一篇:java – 是否可以在现有对象中模拟单个方法?