diff --git a/sharding-example/pom.xml b/sharding-example/pom.xml
index fa1a371..a25f2a3 100644
--- a/sharding-example/pom.xml
+++ b/sharding-example/pom.xml
@@ -40,6 +40,41 @@
spring-boot-starter-tomcat
${spring.boot.version}
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+ ${spring.boot.version}
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ ${spring.boot.version}
+
+
+ io.cucumber
+ cucumber-java
+ 6.8.0
+ test
+
+
+ io.cucumber
+ cucumber-junit
+ 6.8.0
+ test
+
+
+ io.cucumber
+ cucumber-spring
+ 6.8.0
+ test
+
+
+ com.squareup.okhttp3
+ okhttp
+ 4.10.0
+ test
+
\ No newline at end of file
diff --git a/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/CucumberTestConfiguration.java b/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/CucumberTestConfiguration.java
new file mode 100644
index 0000000..f6efea8
--- /dev/null
+++ b/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/CucumberTestConfiguration.java
@@ -0,0 +1,31 @@
+package com.alpha.mongodb.sharding.example;
+
+import com.alpha.mongodb.sharding.example.state.ScenarioState;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import okhttp3.OkHttpClient;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Scope;
+
+import static io.cucumber.spring.CucumberTestContext.SCOPE_CUCUMBER_GLUE;
+
+@Configuration
+public class CucumberTestConfiguration {
+
+ @Bean
+ @Scope(SCOPE_CUCUMBER_GLUE)
+ public ScenarioState featureState() {
+ return new ScenarioState();
+ }
+
+ @Bean
+ public OkHttpClient httpClient() {
+ return new OkHttpClient();
+ }
+
+ @Bean
+ public ObjectMapper objectMapper() {
+ return new ObjectMapper();
+ }
+
+}
diff --git a/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/CucumberTestConstants.java b/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/CucumberTestConstants.java
new file mode 100644
index 0000000..ebdeaf7
--- /dev/null
+++ b/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/CucumberTestConstants.java
@@ -0,0 +1,15 @@
+package com.alpha.mongodb.sharding.example;
+
+import lombok.experimental.UtilityClass;
+
+@UtilityClass
+public class CucumberTestConstants {
+
+ public static final String SCOPE = "scope";
+ public static final String CUKE = "cuke";
+
+ public static final String SCHEME = "http";
+ public static final String BASE_HOSTNAME = "localhost";
+ public static final int PORT = 8080;
+ public static final String BASE_PATH = "sharding-example";
+}
diff --git a/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/ExampleApplicationCucumber.java b/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/ExampleApplicationCucumber.java
new file mode 100644
index 0000000..fdd059c
--- /dev/null
+++ b/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/ExampleApplicationCucumber.java
@@ -0,0 +1,10 @@
+package com.alpha.mongodb.sharding.example;
+
+import io.cucumber.junit.Cucumber;
+import io.cucumber.junit.CucumberOptions;
+import org.junit.runner.RunWith;
+
+@RunWith(Cucumber.class)
+@CucumberOptions(features = "src/integration/resources/features", plugin = {"pretty", "html:target/site/cucumber.html"})
+public class ExampleApplicationCucumber {
+}
diff --git a/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/SpringIntegrationTest.java b/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/SpringIntegrationTest.java
new file mode 100644
index 0000000..9e2bee9
--- /dev/null
+++ b/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/SpringIntegrationTest.java
@@ -0,0 +1,11 @@
+package com.alpha.mongodb.sharding.example;
+
+import io.cucumber.spring.CucumberContextConfiguration;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ContextConfiguration;
+
+@CucumberContextConfiguration
+@ContextConfiguration(classes = {Application.class, ExampleApplicationCucumber.class})
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
+public class SpringIntegrationTest {
+}
diff --git a/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/state/ScenarioState.java b/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/state/ScenarioState.java
new file mode 100644
index 0000000..6673a06
--- /dev/null
+++ b/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/state/ScenarioState.java
@@ -0,0 +1,33 @@
+package com.alpha.mongodb.sharding.example.state;
+
+import io.cucumber.java.Scenario;
+import io.cucumber.spring.ScenarioScope;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@ScenarioScope
+@Data
+@NoArgsConstructor(onConstructor = @__(@Autowired))
+public class ScenarioState {
+ private List stepDefinitionState = new ArrayList<>();
+
+ private StepDefinitionState sharedStepDefinitionState;
+
+ private Scenario scenario;
+
+ public StepDefinitionState getPreviousStepDefinitionState() {
+ return stepDefinitionState.get(stepDefinitionState.size() - 2);
+ }
+
+ public StepDefinitionState getCurrentStepDefinitionState() {
+ return stepDefinitionState.get(stepDefinitionState.size() - 1);
+ }
+
+ public void addStep() {
+ stepDefinitionState.add(new StepDefinitionState());
+ }
+}
diff --git a/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/state/StepDefinitionState.java b/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/state/StepDefinitionState.java
new file mode 100644
index 0000000..f15ddb1
--- /dev/null
+++ b/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/state/StepDefinitionState.java
@@ -0,0 +1,12 @@
+package com.alpha.mongodb.sharding.example.state;
+
+import lombok.Data;
+import okhttp3.Request;
+import okhttp3.Response;
+
+@Data
+public class StepDefinitionState {
+ private Request request;
+ private Object requestBody;
+ private Response response;
+}
diff --git a/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/steps/ApplicationSteps.java b/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/steps/ApplicationSteps.java
new file mode 100644
index 0000000..a9ca282
--- /dev/null
+++ b/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/steps/ApplicationSteps.java
@@ -0,0 +1,59 @@
+package com.alpha.mongodb.sharding.example.steps;
+
+import com.alpha.mongodb.sharding.example.CucumberTestConstants;
+import com.alpha.mongodb.sharding.example.state.ScenarioState;
+import com.alpha.mongodb.sharding.example.utils.ExampleServiceClientUtils;
+import io.cucumber.java.BeforeStep;
+import io.cucumber.java.Scenario;
+import io.cucumber.java.en.Then;
+import io.cucumber.java.en.When;
+import lombok.extern.log4j.Log4j2;
+import okhttp3.HttpUrl;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
+import org.apache.logging.log4j.ThreadContext;
+import org.junit.Before;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.io.IOException;
+
+import static org.junit.Assert.assertEquals;
+
+@Log4j2
+public class ApplicationSteps {
+
+ @Autowired
+ private OkHttpClient okHttpClient;
+
+ @Autowired
+ private ScenarioState scenarioState;
+
+ @Before
+ public void beforeScenario(Scenario scenario) {
+ ThreadContext.put(CucumberTestConstants.SCOPE, CucumberTestConstants.CUKE);
+ scenarioState.setScenario(scenario);
+ }
+
+ @BeforeStep
+ public void beforeStep() {
+ scenarioState.addStep();
+ }
+
+ @When("I call the health API of the sharding example application")
+ public void whenThatShardingExampleApplicationIsUp() throws IOException {
+ HttpUrl httpUrl = ExampleServiceClientUtils.baseUrlBuilder()
+ .addPathSegment("actuator").addPathSegment("health").build();
+ System.out.println(httpUrl);
+ Request request = new Request.Builder().url(httpUrl).get().build();
+ Response healthApiResponse = okHttpClient.newCall(request).execute();
+
+ scenarioState.getCurrentStepDefinitionState().setRequest(request);
+ scenarioState.getCurrentStepDefinitionState().setResponse(healthApiResponse);
+ }
+
+ @Then("I get a response with status code {int}")
+ public void thenIGetResponseWithStatusCode(int status) {
+ assertEquals(status, scenarioState.getPreviousStepDefinitionState().getResponse().code());
+ }
+}
diff --git a/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/utils/ExampleServiceClientUtils.java b/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/utils/ExampleServiceClientUtils.java
new file mode 100644
index 0000000..3f72561
--- /dev/null
+++ b/sharding-example/src/integration/java/com/alpha/mongodb/sharding/example/utils/ExampleServiceClientUtils.java
@@ -0,0 +1,18 @@
+package com.alpha.mongodb.sharding.example.utils;
+
+import com.alpha.mongodb.sharding.example.CucumberTestConstants;
+import lombok.experimental.UtilityClass;
+import okhttp3.HttpUrl;
+
+@UtilityClass
+public class ExampleServiceClientUtils {
+
+ public static HttpUrl.Builder baseUrlBuilder() {
+ return new HttpUrl.Builder()
+ .scheme(CucumberTestConstants.SCHEME)
+ .host(CucumberTestConstants.BASE_HOSTNAME)
+ .port(CucumberTestConstants.PORT)
+ .addPathSegment(CucumberTestConstants.BASE_PATH);
+ }
+
+}
diff --git a/sharding-example/src/integration/resources/features/startup.feature b/sharding-example/src/integration/resources/features/startup.feature
new file mode 100644
index 0000000..a9c1299
--- /dev/null
+++ b/sharding-example/src/integration/resources/features/startup.feature
@@ -0,0 +1,5 @@
+Feature: Verify that the sharding example application comes up
+
+ Scenario: Sharding Example comes up successfully when the application is run
+ When I call the health API of the sharding example application
+ Then I get a response with status code 200
\ No newline at end of file