如何在 Spring Boot 和 JUnit 中执行 Cucumber 集成测试?

How to execute your Cucumber integration tests in Spring Boot and JUnit?

我正在尝试 运行 Cucumber 测试 Spring BootJUnit

但是,当我右键单击并执行 TestRunner class.

时出现以下错误

我是否缺少任何配置?

错误:

cucumber.runtime.junit.UndefinedThrowable: The step "I feed my snake" is undefined
Feature: Snake Charmer

  Scenario: Hearing your snake you anticipate sound # src/test/resources/features/first.feature:3
    Given I have hungry snake                       # SnakeMeasureTest.i_have_hungry_snake()
    When I feed my snake                            # null
    Then I receive snek snek                        # SnakeMeasureTest.receive_snek_snek()

Undefined scenarios:
src/test/resources/features/first.feature:3 # Hearing your snake you anticipate sound

1 Scenarios (1 undefined)
3 Steps (1 skipped, 1 undefined, 1 passed)
0m1.378s


You can implement missing steps with the snippets below:

@When("I feed my snake")
public void i_feed_my_snake() {
    // Write code here that turns the phrase above into concrete actions
    throw new cucumber.api.PendingException();
}

SnakeMeasureTest.java

public class SnakeMeasureTest extends CucumberStepDefinitions {

    @Autowired
    SnakeController snake;

    @Given("^I have hungry snake")
    public void i_have_hungry_snake() {
        assertEquals("hiss", snake.poke());
    }

    @When("^When I feed my snake$")
    public void when_i_feed_my_snake() {
        snake.feed();
    }

    @Then("^I receive snek snek$")
    public void receive_snek_snek() {
        assertEquals("snek snek ^_^", snake.poke());
    }

}

CucumberStepDefinitions.java

@RunWith(SpringRunner.class)
@SpringBootTest
public abstract class CucumberStepDefinitions {

}

TestRunner.java

@RunWith(Cucumber.class)
@CucumberOptions(plugin = {"pretty"}, features = {"src/test/resources/features"})
public class TestRunner {


}

first.feature (src/test/resources/features)

Feature: Snake Charmer

  Scenario: Hearing your snake you anticipate sound
    Given I have hungry snake
    When I feed my snake
    Then I receive snek snek

SnakeController.java

@Controller
public class SnakeController {

    private boolean fed;

    @Autowired
    public SnakeController() {
        super();
    }

    public void feed() {
        fed = true;
    }

    public String poke() {
        if (this.fed == true) {
            return "snek snek ^_^";
        } else {
            return "hiss";
        }
    }

} 

您需要更正您的步骤: 来自:

@When("^When I feed my snake$")
public void when_i_feed_my_snake() {
    snake.feed();
}

为此:

@When("^I feed my snake$")
public void when_i_feed_my_snake() {
    snake.feed();
}  

这个问题是因为您在 @When 注释中包含了黄瓜钩子 'When'