gpt4 book ai didi

java - Spock 的常规测试失败,并在 Stub() 处出现 ArrayIndexOutOfBoundsException

转载 作者:行者123 更新时间:2023-12-01 16:15:03 25 4
gpt4 key购买 nike

我有一个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 类进行 stub -

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 的实现转换器,如下所示 -

public class AgentConverter {             // Here i have removed "implements Converter"

public TicketingAgent convert(RequestWrapper wrapper) {

TicketingAgent agent = new TicketingAgent();

然后事情开始工作并且没有java.lang.ArrayIndexOutOfBoundsException。我试图了解 Spock 框架中的 Stub() 和 stub 类的接口(interface)实现之间的关系。在谷歌中找不到,所以发布在这里...任何帮助表示赞赏。

这是我的 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>

最佳答案

免责声明:我大约 1.5 年前使用过 spock,也许从那时起事情已经发生了变化......

无论如何:

您运行的是 Java 9 吗?

如果是这样,请检查此 cglib issue :

总而言之,cglib 似乎有问题,您可以尝试按照本线程中的建议使用 bytebuddy。

另一种可能的解决方案是重构:

也许BuildTicketingDocumentRequest可以依赖于接口(interface),而不是像AgentConverter这样的具体实现。当从界面中创建模拟时,它应该可以工作。

关于java - Spock 的常规测试失败,并在 Stub() 处出现 ArrayIndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62422303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com