diff --git a/rest-testing/pom.xml b/rest-testing/pom.xml
index b99dfac571..74ea5760c4 100644
--- a/rest-testing/pom.xml
+++ b/rest-testing/pom.xml
@@ -88,6 +88,19 @@
${jbehave.version}
test
+
+
+ com.intuit.karate
+ karate-apache
+ ${karate.version}
+
+
+
+ com.intuit.karate
+ karate-junit4
+ ${karate.version}
+ test
+
@@ -150,6 +163,7 @@
2.9.0
1.2.5
2.4.1
+ 0.6.1
4.4.5
4.5.2
diff --git a/rest-testing/src/main/resources/Feature/cucumber.feature b/rest-testing/src/main/resources/karate/cucumber.feature
similarity index 100%
rename from rest-testing/src/main/resources/Feature/cucumber.feature
rename to rest-testing/src/main/resources/karate/cucumber.feature
diff --git a/rest-testing/src/test/java/com/baeldung/rest/karate/KarateUnitTest.java b/rest-testing/src/test/java/com/baeldung/rest/karate/KarateUnitTest.java
new file mode 100644
index 0000000000..f942721504
--- /dev/null
+++ b/rest-testing/src/test/java/com/baeldung/rest/karate/KarateUnitTest.java
@@ -0,0 +1,44 @@
+package com.baeldung.rest.karate;
+
+import com.github.tomakehurst.wiremock.WireMockServer;
+import com.intuit.karate.junit4.Karate;
+import cucumber.api.CucumberOptions;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.runner.RunWith;
+
+import static com.github.tomakehurst.wiremock.client.WireMock.*;
+import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
+
+@RunWith(Karate.class)
+@CucumberOptions(features = "classpath:karate")
+public class KarateUnitTest {
+
+ private static final WireMockServer wireMockServer = new WireMockServer();
+
+ @BeforeClass
+ public static void setUp() throws Exception {
+ wireMockServer.start();
+
+ configureFor("localhost", 8080);
+ stubFor(get(urlEqualTo("/user/get"))
+ .willReturn(aResponse()
+ .withStatus(200)
+ .withHeader("Content-Type", "application/json")
+ .withBody("{ \"id\": \"1234\", name: \"John Smith\" }")));
+ stubFor(post(urlEqualTo("/user/create"))
+ .withHeader("content-type", equalTo("application/json"))
+ .withRequestBody(containing("id"))
+ .willReturn(aResponse()
+ .withStatus(200)
+ .withHeader("Content-Type", "application/json")
+ .withBody("{ \"id\": \"1234\", name: \"John Smith\" }")));
+
+ }
+
+ @AfterClass
+ public static void tearDown() throws Exception {
+ wireMockServer.stop();
+ }
+
+}
diff --git a/rest-testing/src/test/resources/karate/user.feature b/rest-testing/src/test/resources/karate/user.feature
new file mode 100644
index 0000000000..d9f0f12a9c
--- /dev/null
+++ b/rest-testing/src/test/resources/karate/user.feature
@@ -0,0 +1,42 @@
+Feature: Testing a REST API with Karate
+
+Scenario: Testing valid GET endpoint
+ Given url 'http://localhost:8080/user/get'
+ When method GET
+ Then status 200
+
+Scenario: Testing an invalid GET endpoint - 404
+ Given url 'http://localhost:8080/user/wrong'
+ When method GET
+ Then status 404
+
+Scenario: Testing the exact response of a GET endpoint
+ Given url 'http://localhost:8080/user/get'
+ When method GET
+ Then status 200
+ And match $ == {id:"1234",name:"John Smith"}
+
+Scenario: Testing the exact response field value of a GET endpoint
+ Given url 'http://localhost:8080/user/get'
+ When method GET
+ Then status 200
+ And match $.id == "1234"
+
+Scenario: Testing that GET response contains specific field
+ Given url 'http://localhost:8080/user/get'
+ When method GET
+ Then status 200
+ And match $ contains {id:"1234"}
+
+Scenario: Test GET response using markers
+ Given url 'http://localhost:8080/user/get'
+ When method GET
+ Then status 200
+ And match $ == {id:"#notnull",name:"John Smith"}
+
+Scenario: Testing a POST endpoint with request body
+ Given url 'http://localhost:8080/user/create'
+ And request { id: '1234' , name: 'John Smith'}
+ When method POST
+ Then status 200
+ And match $ contains {id:"#notnull"}