Тест Спока groovy завершился неудачно с исключением ArrayIndexOutOfBoundsException в Stub () - PullRequest
0 голосов
/ 17 июня 2020

У меня есть 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 И реализацией интерфейса заглушенного класса. Не удалось найти в 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>

1 Ответ

0 голосов
/ 17 июня 2020

Заявление об ограничении ответственности: я использовал spock ~ 1,5 года go, может быть, с тех пор все изменилось ...

В любом случае:

Вы используете Java 9?

Если да, проверьте это cglib issue :

Похоже, что у all-in-all cglib есть проблема, вы можете попробовать использовать вместо этого bytebuddy, как предлагается в этой теме .

Другое возможное решение - рефакторинг:

Возможно, BuildTicketingDocumentRequest может зависеть от интерфейса, а не от конкретной реализации, например AgentConverter. Когда макет создается из интерфейса, он должен работать.

...