Karate BDD framework throwing NPE with simple configuration

584 Views Asked by At

I'm trying to use the Karate BDD framework for running tests on my API suite and I'm running into an NPE. As far as I can tell, I haven't misconfigured anything, but I'm sure I've overlooked something. Given the below feature file and task runner, is there something that I've done wrong?

Update: this works with Karate 0.2.9 but not the latest currently 0.5.0.2

Feature File: .../src/test/resources/root/feature/sanity.feature

Feature: Sanity Check
  As a developer
  I want to ensure that the test framework is active
  So that I can be confident I am testing correctly

  Background:
    * url httpBin

  Scenario: httpBin reflection
    Given path '/anything/foo/bar?baz=quux'
    When method GET
    Then status 200
    And match response contains { "args": {"baz":"quux"}}
    And match response contains { "method": "GET" }

Driver: .../src/test/java/root/feature/sanity/SmokeTest.java

package root.feature.sanity;

import com.intuit.karate.junit4.Karate;
import cucumber.api.CucumberOptions;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.runner.RunWith;

/**
 * Created by williamspaul on 8/29/17.
 */
@RunWith(Karate.class)
@CucumberOptions(plugin = {"pretty", "html:target/cucumber"})
public class SmokeTest {

    @BeforeClass
    public static void beforeClass() {}

    @AfterClass
    public static void afterClass() {}

}

mvn test output

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running root.feature.sanity.SmokeTest
10:46:08.568 [main] DEBUG com.intuit.karate.cucumber.CucumberRunner - init test class: class apigee.feature.sanity.SmokeTest
10:46:08.680 [main] DEBUG com.intuit.karate.cucumber.CucumberRunner - loading feature: /(private-path)/target/test-classes/root/feature/sanity/sanity.feature
Feature: Sanity Check
  As a developer
  I want to ensure that the test framework is active
  So that I can be confident I am testing correctly

  Background:     # apigee/feature/sanity/sanity.feature:6
    * url httpBin

0 Scenarios
0 Steps
0m0.000s

Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.389 sec <<< FAILURE!
Feature: Sanity Check  Time elapsed: 0.11 sec  <<< ERROR!
java.lang.NullPointerException
    at com.intuit.karate.cucumber.CucumberUtils.afterStep(CucumberUtils.java:148)
    at com.intuit.karate.cucumber.CucumberUtils.runStep(CucumberUtils.java:140)
    at com.intuit.karate.cucumber.KarateRuntime.runStep(KarateRuntime.java:51)
    at cucumber.runtime.model.StepContainer.runStep(StepContainer.java:44)
    at cucumber.runtime.model.StepContainer.runSteps(StepContainer.java:39)
    at cucumber.runtime.model.CucumberScenario.runBackground(CucumberScenario.java:59)
    at cucumber.runtime.model.CucumberScenario.run(CucumberScenario.java:42)
    at cucumber.runtime.junit.ExecutionUnitRunner.run(ExecutionUnitRunner.java:102)
    at cucumber.runtime.junit.FeatureRunner.runChild(FeatureRunner.java:63)
    at cucumber.runtime.junit.FeatureRunner.runChild(FeatureRunner.java:18)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at cucumber.runtime.junit.FeatureRunner.run(FeatureRunner.java:70)
    at com.intuit.karate.junit4.Karate.runChild(Karate.java:60)
    at com.intuit.karate.junit4.Karate.runChild(Karate.java:25)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at com.intuit.karate.junit4.Karate.run(Karate.java:66)
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
    at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)


Results :

Tests in error:
  Feature: Sanity Check

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

There are 1 best solutions below

4
On BEST ANSWER

You are actually using a beta release. Just use 0.5.0 and you will be fine.

BTW a big thanks for finding this, is fixed in the develop branch: https://github.com/intuit/karate/issues/158

Also do look at this tweet for details on why this before / after step hook is needed