【发布时间】:2018-05-21 09:31:15
【问题描述】:
我有以下扩展抽象类的类
public class MyConverter extends AbstractConverter<A, B> {
@Override
public B convert(A source) {
// implementation here
}
}
AbstractConverter来自org.modelmapper,它的声明如下:
public abstract class AbstractConverter<S, D> implements Converter<S, D> {
...
}
现在,从使用 Spock 的 Groovy 文件中,我想模拟我的课程:
class ATestOverThere extends Specification {
def myConverter = Mock(MyConverter) // THIS THROWS THE EXCEPTION
...
}
但我在初始化模拟时遇到了以下异常。
java.lang.IllegalArgumentException
at net.sf.cglib.proxy.BridgeMethodResolver.resolveAll(BridgeMethodResolver.java:61)
at net.sf.cglib.proxy.Enhancer.emitMethods(Enhancer.java:911)
at net.sf.cglib.proxy.Enhancer.generateClass(Enhancer.java:498)
at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)
at net.sf.cglib.proxy.Enhancer.createClass(Enhancer.java:317)
at org.spockframework.mock.runtime.ProxyBasedMockFactory$CglibMockFactory.createMock(ProxyBasedMockFactory.java:154)
at org.spockframework.mock.runtime.ProxyBasedMockFactory.create(ProxyBasedMockFactory.java:68)
at org.spockframework.mock.runtime.JavaMockFactory.createInternal(JavaMockFactory.java:59)
at org.spockframework.mock.runtime.JavaMockFactory.create(JavaMockFactory.java:40)
at org.spockframework.mock.runtime.CompositeMockFactory.create(CompositeMockFactory.java:44)
at org.spockframework.lang.SpecInternals.createMock(SpecInternals.java:51)
at org.spockframework.lang.SpecInternals.createMockImpl(SpecInternals.java:296)
at org.spockframework.lang.SpecInternals.createMockImpl(SpecInternals.java:286)
at org.spockframework.lang.SpecInternals.MockImpl(SpecInternals.java:105)
at com.tuenti.services.argentina.business.products.sva.SvaManagerSpec.$spock_initializeFields(SvaManagerSpec.groovy:14)
似乎我无法模拟一个用 Spock 扩展抽象类的类,可以吗?
【问题讨论】:
-
我相信这是一个重复的问题。有关更多信息,请参阅这篇文章(我可以通过添加 objenesis 和 byte-buddy 库来让您的示例正常工作) - semaphoreci.com/community/tutorials/…
-
虽然这里除了 CGLIB 之外确实需要 Objenesis,但不需要 ByteBuddy。跨度>
标签: java groovy mocking abstract-class spock