java - Spock 的 groovy 测试在 Stub() 处出现 ArrayIndexOutOfBoundsException 失败
问题描述
我有一个 java 类AgentConverter
,它实现
了org.springframework.core.convert.converter.Converter
-
public class AgentConverter implements Converter<RequestWrapper, TicketingAgent> {
public TicketingAgent convert(RequestWrapper wrapper) {
TicketingAgent agent = new TicketingAgent();
....
....
然后我有上面使用的java类AgentConverter
-
public class BuildTicketingDocumentRequest implements BuildRequest<TicketingDocumentRequest> {
private final PosConverter posConverter;
private final AgentConverter agentConverter; //here it is ..
private final TransactionInfoConverter transactionInfoConverter;
private final BuildRequestComponent<TicketingDocument> buildRequestComponent;
我已经编写了 Groovy 测试用例,我正在对AgentConverter
课程进行存根 -
class ConversionStrategyForDocCreateTest extends EdiSimulator {
def "Master Test for Build Conversion Strategy to create TicketingDocumentRequest"() {
given:"Mocked Classes"
AgentConverter agentConverter = Stub(AgentConverter.class) // this line exception comes
agentConverter.convert(wrapper) >> new TicketingAgent()
.....
.....
现在当上面的测试用例 - 我得到:
java.lang.ArrayIndexOutOfBoundsException: 45569
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:91)
at org.spockframework.mock.runtime.ProxyBasedMockFactory.create(ProxyBasedMockFactory.java:49)
at org.spockframework.mock.runtime.JavaMockFactory.create(JavaMockFactory.java:51)
at org.spockframework.mock.runtime.CompositeMockFactory.create(CompositeMockFactory.java:44)
at org.spockframework.lang.SpecInternals.createMock(SpecInternals.java:45)
at org.spockframework.lang.SpecInternals.createMockImpl(SpecInternals.java:281)
at org.spockframework.lang.SpecInternals.StubImpl(SpecInternals.java:131)
at com.sabre.ticketing.hub.converter.startegy.ConversionStrategyForDocCreateMasterTest.Master Test for Build Conversion Strategy to create TicketingDocumentRequest(ConversionStrategyForDocCreateMasterTest.groovy:35)
在命中和试用时,我发现如果我删除 AgentConverter 的 实现 Converter,如下所示 -
public class AgentConverter { // Here i have removed "implements Converter"
public TicketingAgent convert(RequestWrapper wrapper) {
TicketingAgent agent = new TicketingAgent();
然后事情开始工作并且没有java.lang.ArrayIndexOutOfBoundsException
。我试图了解Stub()
Spock 框架和存根类的接口实现之间的关系。无法在谷歌找到所以张贴在这里...任何帮助表示赞赏。
这是我的 spock 和 groovy 版本的 POM 片段:
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-core</artifactId>
<version>1.0-groovy-2.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.4.4</version>
<scope>test</scope>
</dependency>
解决方案
免责声明:我使用 spock ~ 1.5 年前,也许从那以后事情发生了变化......
反正:
您正在使用 Java 9 运行吗?
如果是这样,请检查此cglib 问题:
总而言之 cglib 似乎有一个问题,您可以尝试使用 bytebuddy 来代替此线程中的建议。
另一种可能的解决方案是重构:
也许BuildTicketingDocumentRequest
可以依赖于接口而不是具体的实现,例如AgentConverter
. 当从界面创建模拟时,它应该可以工作。
推荐阅读
- c++ - 在此代码中执行第一个表达式后,k 的值如何变为-5?
- r - 如何按行主要顺序排列表格?
- javascript - 如何替换 DOM 元素中的元素列表
- excel - Excel 中的工作表副本运行时错误
- postgresql - 有人用 MyBatis 配置过 SSL 吗?
- html - 背景附件到底是做什么的?
- java - LibGDX - Actor 类的父类如何工作?
- ios - 在 ios 应用程序中实施共享 Web 凭据是否存在任何安全问题?
- tomcat - Sap Hybris ant 初始化错误:线程“AfterSaveEventPublisher-master”中的异常
- html - Azure 静态网站以一种奇怪的方式编码撇号和其他字符