diff --git a/build.gradle b/build.gradle index 595f558..cdec02f 100644 --- a/build.gradle +++ b/build.gradle @@ -14,6 +14,10 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation('org.springframework.boot:spring-boot-starter-test') + testImplementation 'io.cucumber:cucumber-java:7.14.0' + testImplementation 'io.cucumber:cucumber-junit:7.14.0' + testImplementation 'io.cucumber:cucumber-spring:7.14.0' + testImplementation 'org.junit.vintage:junit-vintage-engine:5.10.3' } test { diff --git a/src/main/java/com/wilkins/showcase/ShowcaseApplication.java b/src/main/java/com/wilkins/showcase/ShowcaseApplication.java index e2e2586..9eb4673 100644 --- a/src/main/java/com/wilkins/showcase/ShowcaseApplication.java +++ b/src/main/java/com/wilkins/showcase/ShowcaseApplication.java @@ -5,7 +5,6 @@ @SpringBootApplication public class ShowcaseApplication { - public static void main(String[] args) { SpringApplication.run(ShowcaseApplication.class, args); } diff --git a/src/test/java/com/wilkins/showcase/CucumberIntegrationTest.java b/src/test/java/com/wilkins/showcase/CucumberIntegrationTest.java new file mode 100644 index 0000000..3a090e6 --- /dev/null +++ b/src/test/java/com/wilkins/showcase/CucumberIntegrationTest.java @@ -0,0 +1,10 @@ +package com.wilkins.showcase; + +import io.cucumber.junit.Cucumber; +import io.cucumber.junit.CucumberOptions; +import org.junit.runner.RunWith; + +@RunWith(Cucumber.class) +@CucumberOptions(features = "src/test/resources") +public class CucumberIntegrationTest { +} diff --git a/src/test/java/com/wilkins/showcase/GreetingStepDefs.java b/src/test/java/com/wilkins/showcase/GreetingStepDefs.java new file mode 100644 index 0000000..6dcabb1 --- /dev/null +++ b/src/test/java/com/wilkins/showcase/GreetingStepDefs.java @@ -0,0 +1,27 @@ +package com.wilkins.showcase; + +import io.cucumber.java.en.Then; +import io.cucumber.java.en.When; + +import static org.assertj.core.api.Assertions.assertThat; + +public class GreetingStepDefs extends SpringIntegrationStepDefs { + + JsonGreeting greeting; + + @When("api call to {string}") + public void apiCallToGreeting(String path) { + greeting = getRestTemplate().getForObject(getBaseUrl() + path, JsonGreeting.class); + } + + @Then("{string} greeting is returned") + public void greetingIsReturned(String greetingMessage) { + assertThat(greeting.message()).isEqualTo(greetingMessage); + } + + private record JsonGreeting(String salutation, String name) { + String message() { + return salutation + " " + name; + } + } +} diff --git a/src/test/java/com/wilkins/showcase/SpringIntegrationStepDefs.java b/src/test/java/com/wilkins/showcase/SpringIntegrationStepDefs.java new file mode 100644 index 0000000..92c3569 --- /dev/null +++ b/src/test/java/com/wilkins/showcase/SpringIntegrationStepDefs.java @@ -0,0 +1,25 @@ +package com.wilkins.showcase; + +import io.cucumber.spring.CucumberContextConfiguration; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.server.LocalServerPort; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.web.client.RestTemplate; + +@CucumberContextConfiguration +@SpringBootTest(classes = ShowcaseApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class SpringIntegrationStepDefs { + @LocalServerPort + int port; + @Autowired + RestTemplateBuilder restTemplateBuilder; + + protected String getBaseUrl() { + return "http://localhost:" + port; + } + + protected RestTemplate getRestTemplate() { + return restTemplateBuilder.build(); + } +} diff --git a/src/test/java/com/wilkins/showcase/controller/GreetingApplicationTest.java b/src/test/java/com/wilkins/showcase/controller/GreetingApplicationTest.java new file mode 100644 index 0000000..9899c64 --- /dev/null +++ b/src/test/java/com/wilkins/showcase/controller/GreetingApplicationTest.java @@ -0,0 +1,27 @@ +package com.wilkins.showcase.controller; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.web.server.LocalServerPort; +import org.springframework.boot.web.client.RestTemplateBuilder; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class GreetingApplicationTest { + + @Autowired + RestTemplateBuilder restTemplateBuilder; + + @LocalServerPort + int port; + + @Test + void canGetGreeting() { + var restTemplate = restTemplateBuilder.build(); + var url = "http://localhost:%s/greetings".formatted(port); + var greeting = restTemplate.getForObject(url, String.class); + assertNotNull(greeting); + } +} diff --git a/src/test/resources/Greeting.feature b/src/test/resources/Greeting.feature new file mode 100644 index 0000000..9e69939 --- /dev/null +++ b/src/test/resources/Greeting.feature @@ -0,0 +1,9 @@ +Feature: Greeting can be retrieved + + Scenario: Default greeting returned + When api call to "/greetings" + Then "hello world" greeting is returned + + Scenario: Special greeting returned + When api call to "/greetings?salutation=Morning&name=Robin" + Then "Morning Robin" greeting is returned