Spock的groovy测试在Stub()处出现ArrayIndexOutOfBoundsException,导致测试失败。

问题描述 投票:0回答:1

我有一个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的 实现转换器 如下图所示

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

    public TicketingAgent convert(RequestWrapper wrapper) {

        TicketingAgent agent = new TicketingAgent();

然后,事情开始工作,没有 java.lang.ArrayIndexOutOfBoundsException. 我想了解一下,这两者之间的关系是什么?Stub() 在Spock框架和stubbed类的接口实现。在google里找不到,所以发在这里...... 任何帮助是感激的。

这里是我的POM片段为spock & groovy版本。

  <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>
java groovy spock
1个回答
0
投票

免责声明:我使用斯波克~1.5年前,也许从那时起,事情已经发生了变化......

总之,你使用的是Java 9吗?

你在用Java 9运行吗?

如果是的话,请检查这个 cglib问题:

总的来说,cglib似乎有问题,你可以尝试使用bytebuddy,就像这个帖子里建议的那样。

另一个可能的解决方案是重构。

也许 BuildTicketingDocumentRequest 可以依赖接口而不是像 AgentConverter. 当mock被创建出来的界面,它应该工作。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.