【问题标题】:Spock's groovy test fails with ArrayIndexOutOfBoundsException at Stub()Spock 的 groovy 测试在 Stub() 处出现 ArrayIndexOutOfBoundsException 失败
【发布时间】:2020-06-17 05:54:21
【问题描述】:

我有一个 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 的 implements Converter -

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

    public TicketingAgent convert(RequestWrapper wrapper) {

        TicketingAgent agent = new TicketingAgent();

然后事情开始工作,没有java.lang.ArrayIndexOutOfBoundsException。我试图了解 Spock 框架中的 Stub() 与存根类的接口实现之间的关系。在 google 中找不到,所以在这里发布...感谢任何帮助。

这是我用于 spock 和 groovy 版本的 POM sn-p:

  <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.3(或 2.0-M3)和 Byte Buddy 检查您的代码。 Spock 1.0 已于 5 年前发布。从那时起,已经修复了许多错误。

标签: java groovy spock


【解决方案1】:

免责声明:我在 1.5 年前使用 spock,也许从那以后情况发生了变化......

无论如何:

您使用的是 Java 9 吗?

如果有,请查看cglib issue

all-in-all cglib 似乎有问题,您可以尝试使用 bytebuddy 来代替此线程中的建议。

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

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

【讨论】:

    猜你喜欢
    • 2020-05-25
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-23
    • 2017-11-25
    • 2017-01-25
    相关资源
    最近更新 更多