我试图让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;
}

请注意回拨,因为在最坏的情况下,实际目标周围有多个代理。

10-05 21:12
查看更多