Spring Top

I just announced the new Learn Spring course, focused on the fundamentals of Spring 5 and Spring Boot 2:

>> CHECK OUT THE COURSE

1. Overview

Cucumber is a very powerful testing framework written in the Ruby programming language, which follows the BDD (behavior-driven development) methodology. It enables developers to write high-level use cases in plain text that can be verified by non-technical stakeholders, and turn them into executable tests, written in a language called Gherkin.

We have already discussed these in a different article.

And the Cucumber-Spring Integration is intended to make test automation easier. Once we have the Cucumber tests integrated with Spring, we should be able to execute them along with the Maven build.

2. Maven Dependencies

Let's get started using the Cucumber-Spring integration by defining the Maven dependencies – starting with the Cucumber-JVM dependency:

<dependency>
    <groupId>io.cucumber</groupId>
    <artifactId>cucumber-java</artifactId>
    <version>6.8.0</version>
    <scope>test</scope>
</dependency>

We can find the most recent version of Cucumber JVM here.

Next, we'll add the JUnit and Cucumber testing dependency:

<dependency>
    <groupId>io.cucumber</groupId>
    <artifactId>cucumber-junit</artifactId>
    <version>6.8.0</version>
    <scope>test</scope>
</dependency>

The most recent version of Cucumber JUnit can be found here.

And finally, the Spring and Cucumber dependency:

<dependency>
    <groupId>io.cucumber</groupId>
    <artifactId>cucumber-spring</artifactId>
    <version>6.8.0</version>
    <scope>test</scope>
</dependency>

Again, we can check out the most recent version of Cucumber Spring over here.

3. Configuration

We'll now look at how we can integrate Cucumber in a Spring application.

First, we'll create a Spring Boot application – for which we'll follow the Spring-Boot application article. Then, we'll create a Spring REST service and write the Cucumber test for it.

3.1. REST Controller

First, let's create a simple controller:

@RestController
public class VersionController {
    @GetMapping("/version")
    public String getVersion() {
        return "1.0";
    }
}

3.2. Cucumber Step Definitions

All we need to run our Cucumber tests with JUnit is to create a single empty class with an annotation @RunWith(Cucumber.class):

@RunWith(Cucumber.class)
@CucumberOptions(features = "src/test/resources")
public class CucumberIntegrationTest {
}

We can see the annotation @CucumberOptions where we're specifying the location of the Gherkin file which is also known as the feature file. At this point, Cucumber recognizes the Gherkin language; you can read more about Gherkin in the article mentioned in the introduction.

So now, let's create a Cucumber feature file:

Feature: the version can be retrieved
  Scenario: client makes call to GET /version
    When the client calls /version
    Then the client receives status code of 200
    And the client receives server version 1.0

The Scenario is to make a GET call to the REST service url /version and verify the response.

Next, we need to create a so-called glue code. These are methods that link a single Gherkin step with Java code.

We have to options here – we can either use Cucumber Expressions or regular expressions inside the annotations. In our case, we'll stick to the regular expressions:

@When("^the client calls /version$")
public void the_client_issues_GET_version() throws Throwable{
    executeGet("http://localhost:8080/version");
}

@Then("^the client receives status code of (\\d+)$")
public void the_client_receives_status_code_of(int statusCode) throws Throwable {
    HttpStatus currentStatusCode = latestResponse.getTheResponse().getStatusCode();
    assertThat("status code is incorrect : "+ 
    latestResponse.getBody(), currentStatusCode.value(), is(statusCode));
}

@And("^the client receives server version (.+)$")
public void the_client_receives_server_version_body(String version) throws Throwable {
    assertThat(latestResponse.getBody(), is(version));
}

So now let's integrate the Cucumber tests with the Spring Application Context. For that, we'll create a new class and annotate it with @SpringBootTest and @CucumberContextConfiguration:

@CucumberContextConfiguration
@SpringBootTest
public class SpringIntegrationTest {
    // executeGet implementation
}

Now all the Cucumber definitions can go into a separate Java class which extends SpringIntegrationTest:

public class StepDefs extends SpringIntegrationTest {
   
    @When("^the client calls /version$")
    public void the_client_issues_GET_version() throws Throwable {
        executeGet("http://localhost:8080/version");
    }
}

We are all set for a test run now.

Finally, we can do a quick run via the command line, simply running mvn clean install -Pintegration – Maven will execute the integration tests and show the results in the console.

3 Scenarios ([32m3 passed[0m)
9 Steps ([32m9 passed[0m)
0m1.054s

Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 9.283 sec - in
  com.baeldung.CucumberTest
2016-07-30 06:28:20.142  INFO 732 --- [Thread-2] AnnotationConfigEmbeddedWebApplicationContext :
  Closing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext:
  startup date [Sat Jul 30 06:28:12 CDT 2016]; root of context hierarchy

Results :

Tests run: 12, Failures: 0, Errors: 0, Skipped: 0

4. Conclusion

Having configured Cucumber with Spring, it will be handy to use Spring-configured components in BDD testing. This is a simple guide for integrating the Cucumber test in a Spring-Boot application.

As usual, all code samples shown in this tutorial are available over on GitHub.

Spring bottom

I just announced the new Learn Spring course, focused on the fundamentals of Spring 5 and Spring Boot 2:

>> CHECK OUT THE COURSE
4 Comments
Oldest
Newest
Inline Feedbacks
View all comments
James Haugen
James Haugen
3 years ago

hello, do you have example for setting up cucumber, TestNg, spring, and mockito?

Eugen Paraschiv
3 years ago
Reply to  James Haugen

Hey James,
That’s an interesting question – there’s no article that covers all of them at once, but there are individual pieces about: Cucumber, and Cucumber with Spring, TestNG, Mockito.

Hope that helps. Cheers,
Eugen.

Ankit
Ankit
3 years ago

Could you help with definition of method executeGet?

Comments are closed on this article!