Cucumber 5.0.0 и Springboot для нескольких сцен ios в одном файле функций - PullRequest
1 голос
/ 28 февраля 2020

Моя зависимость от Springboot:

    <dependency>
        <groupId>io.cucumber</groupId>
        <artifactId>cucumber-java8</artifactId>
        <version>${cucumber.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>io.cucumber</groupId>
        <artifactId>cucumber-java</artifactId>
        <version>${cucumber.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>io.cucumber</groupId>
        <artifactId>cucumber-junit</artifactId>
        <version>${cucumber.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>io.cucumber</groupId>
        <artifactId>cucumber-spring</artifactId>
        <version>${cucumber.version}</version>
        <scope>test</scope>
    </dependency>



Feature: Bag Functionality

  Scenario: Putting one thing in the bag
    Given the bag is empty
    When I put 1 potato in the bag
    Then the bag should contain only 1 potato

  Scenario: Putting few things in the bag
    Given the bag is empty
    When I put 1 potato in the bag
    And I put 2 cucumber in the bag
    Then the bag should contain 1 potato

Когда я запускаю этот файл функций, я получаю исключение

05:08:16.249 [main] DEBUG org.springframework.context.support.GenericApplicationContext - Refreshing org.springframework.context.support.GenericApplicationContext@6f03482
Feb 28, 2020 5:08:16 AM io.cucumber.core.runtime.Runtime run
SEVERE: Exception while executing pickle
java.util.concurrent.ExecutionException: java.lang.IllegalStateException: GenericApplicationContext does not support multiple refresh attempts: just call 'refresh' once
    at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:122)
    at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:191)
    at io.cucumber.core.runtime.Runtime.run(Runtime.java:108)
    at io.cucumber.core.cli.Main.run(Main.java:73)
    at cucumber.api.cli.Main.run(Main.java:28)
    at cucumber.api.cli.Main.main(Main.java:15)
Caused by: java.lang.IllegalStateException: GenericApplicationContext does not support multiple refresh attempts: just call 'refresh' once
    at org.springframework.context.support.GenericApplicationContext.refreshBeanFactory(GenericApplicationContext.java:266)
    at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:637)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:522)
    at io.cucumber.spring.TestContextAdaptor$FallbackApplicationContextAdaptor.start(TestContextAdaptor.java:127)
    at io.cucumber.spring.SpringFactory.start(SpringFactory.java:165)
    at io.cucumber.core.runner.Runner.buildBackendWorlds(Runner.java:163)
    at io.cucumber.core.runner.Runner.runPickle(Runner.java:61)
    at io.cucumber.core.runtime.Runtime.lambda$null$2(Runtime.java:100)
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at io.cucumber.core.runtime.Runtime$SameThreadExecutorService.execute(Runtime.java:243)
    at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:118)
    at io.cucumber.core.runtime.Runtime.lambda$run$3(Runtime.java:100)
    at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
    at java.base/java.util.stream.SliceOps$1$1.accept(SliceOps.java:199)
    at java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1631)
    at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:127)
    at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:502)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:488)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
    at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)
    at io.cucumber.core.runtime.Runtime.run(Runtime.java:101)
    ... 3 more

Exception in thread "main" io.cucumber.core.exception.CucumberException: java.lang.IllegalStateException: GenericApplicationContext does not support multiple refresh attempts: just call 'refresh' once
    at io.cucumber.core.runtime.Runtime.run(Runtime.java:118)
    at io.cucumber.core.cli.Main.run(Main.java:73)
    at cucumber.api.cli.Main.run(Main.java:28)
    at cucumber.api.cli.Main.main(Main.java:15)
Caused by: java.lang.IllegalStateException: GenericApplicationContext does not support multiple refresh attempts: just call 'refresh' once
    at org.springframework.context.support.GenericApplicationContext.refreshBeanFactory(GenericApplicationContext.java:266)
    at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:637)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:522)
    at io.cucumber.spring.TestContextAdaptor$FallbackApplicationContextAdaptor.start(TestContextAdaptor.java:127)
    at io.cucumber.spring.SpringFactory.start(SpringFactory.java:165)
    at io.cucumber.core.runner.Runner.buildBackendWorlds(Runner.java:163)
    at io.cucumber.core.runner.Runner.runPickle(Runner.java:61)
    at io.cucumber.core.runtime.Runtime.lambda$null$2(Runtime.java:100)
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at io.cucumber.core.runtime.Runtime$SameThreadExecutorService.execute(Runtime.java:243)
    at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:118)
    at io.cucumber.core.runtime.Runtime.lambda$run$3(Runtime.java:100)
    at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
    at java.base/java.util.stream.SliceOps$1$1.accept(SliceOps.java:199)
    at java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1631)
    at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:127)
    at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:502)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:488)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
    at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)
    at io.cucumber.core.runtime.Runtime.run(Runtime.java:101)
    ... 3 more
05:08:16.257 [SpringContextShutdownHook] DEBUG org.springframework.context.support.GenericApplicationContext - Closing org.springframework.context.support.GenericApplicationContext@6f03482, started on Fri Feb 28 05:08:16 CET 2020

Process finished with exit code 1

Он успешно запускает один сценарий и вылетает во втором.

Если я изменю версию огурца на 4.8.1, оба сценария ios могут работать. Разве невозможно запустить несколько сцен ios из одного файла функций в огурце 5 с пружинной загрузкой?

1 Ответ

1 голос
/ 28 февраля 2020

Похоже, вы столкнулись с ошибкой с огурцом. Cucumber не может найти конфигурацию контекста в ваших определениях шагов, поэтому он возвращается к GenericApplicationContext, который не может быть обновлен между сценариями ios.

Попробуйте добавить конфигурацию контекста к вашему шагу определения. Например:

├── pom.xml
└── src
    ├── main
    │   └── java
    │       └── com
    │           └── example
    │               └── Application.java
    └── test
        ├── java
        │   └── com
        │       └── example
        │           ├── RunCucumberTest.java
        │           └── StepDefinitions.java
        └── resources
            └── com
                └── example
                    └── example.feature

package com.example;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
}
package com.example;

import io.cucumber.junit.Cucumber;
import io.cucumber.junit.CucumberOptions;
import org.junit.runner.RunWith;

@RunWith(Cucumber.class)
@CucumberOptions(plugin = {"pretty"})
public class RunCucumberTest {
}
package com.example;

import io.cucumber.java.en.Given;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import org.springframework.test.annotation.DirtiesContext;

import static org.junit.Assert.assertNotNull;

@SpringBootTest
public class StepDefinitions {
    @Autowired
    private ApplicationContext applicationContext;

    @Given("an application context")
    public void anApplicationContext() {
        assertNotNull(applicationContext);
    }
}

Поскольку StepDefinitions аннотирован с помощью конфигурации контекста (@SpringBootTest), огурец передаст это в Springs TestContextManager. Это создаст контекст приложения и убедится, что выполнение сценария похоже на тест JUnit с SpringRunner/SpringExtension.

. Здесь также можно использовать другие конфигурации контекста. Например:

package com.example;

import io.cucumber.java.en.Given;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;

import static org.junit.Assert.assertNotNull;

@ContextConfiguration("classpath:cucumber.xml")
public class StepDefinitions {
    @Autowired
    private ApplicationContext applicationContext;

    @Given("an application context")
    public void anApplicationContext() {
        assertNotNull(applicationContext);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...