Implement 'Pending' as a valid Cucumber Step Definition return type

Several implementations of Cucumber allow for @Given @When @Then step definitions to return pending and allow the Test Execution Report to display the number of Passing, Failing, and Pending tests. In Test-First Development, Pending status conveys something different than Failed, where Failed is truly that, a failing test case, while Pending is more like “This feature has not been worked on yet. It’s not working, but it’s also not failing.”

As a follow-up, I was able to determine that by importing cucumber.api.PendingException in my test steps definition class, I could throw new PendingException(). Upon running the test, the console log correctly indicates

Pending scenarios:
C:/…/Katalon Studio/Customer Portal/Include/features/Login/Login.feature:17 # Login with valid user credentials

and colors this text differently (yellow). The summary indicates:

1 Scenarios (1 pending)
4 Steps (2 skipped, 1 pending, 1 passed)
2.667s

However, the test case, despite being marked Pending in the logs, is marked as a FAIL. The Test Summary Report PDF picks up this test as a Failed Test even though there is a place for Incomplete tests.

The next line in the console log is an exception as follows:

2019-04-05 09:59:35.975 e[1;31mERROR e[36mc.k.k.core.keyword.internal.KeywordMain - :x: Keyword runFeatureFolder was failed (Root cause: groovy.lang.MissingMethodException: No signature of method: static com.kms.katalon.core.keyword.internal.KeywordMain.stepFailed() is applicable for argument types: (java.lang.String) values: [Run feature folder ‘Include/features/Login’ failed]
Possible solutions: stepFailed(java.lang.String, com.kms.katalon.core.model.FailureHandling), stepFailed(java.lang.String, com.kms.katalon.core.model.FailureHandling, java.lang.Throwable), stepFailed(java.lang.String, com.kms.katalon.core.model.FailureHandling, java.lang.Throwable, java.util.Map)
at com.kms.katalon.core.cucumber.keyword.CucumberBuiltinKeywords$_runFeatureFolder_closure2.doCall(CucumberBuiltinKeywords.groovy:154)
at com.kms.katalon.core.cucumber.keyword.CucumberBuiltinKeywords$_runFeatureFolder_closure2.doCall(CucumberBuiltinKeywords.groovy)
at com.kms.katalon.core.keyword.internal.KeywordMain.runKeyword(KeywordMain.groovy:66)
at com.kms.katalon.core.keyword.internal.KeywordMain$runKeyword.call(Unknown Source)
at com.kms.katalon.core.cucumber.keyword.CucumberBuiltinKeywords.runFeatureFolder(CucumberBuiltinKeywords.groovy:120)
at com.kms.katalon.core.cucumber.keyword.CucumberBuiltinKeywords$runFeatureFolder$0.callStatic(Unknown Source)
at com.kms.katalon.core.cucumber.keyword.CucumberBuiltinKeywords.runFeatureFolder(CucumberBuiltinKeywords.groovy:172)
at com.kms.katalon.core.cucumber.keyword.CucumberBuiltinKeywords$runFeatureFolder.call(Unknown Source)
at Login Cucumber Tests.run(Login Cucumber Tests:16)
at com.kms.katalon.core.main.ScriptEngine.run(ScriptEngine.java:194)
at com.kms.katalon.core.main.ScriptEngine.runScriptAsRawText(ScriptEngine.java:119)
at com.kms.katalon.core.main.TestCaseExecutor.runScript(TestCaseExecutor.java:331)
at com.kms.katalon.core.main.TestCaseExecutor.doExecute(TestCaseExecutor.java:322)
at com.kms.katalon.core.main.TestCaseExecutor.processExecutionPhase(TestCaseExecutor.java:301)
at com.kms.katalon.core.main.TestCaseExecutor.accessMainPhase(TestCaseExecutor.java:293)
at com.kms.katalon.core.main.TestCaseExecutor.execute(TestCaseExecutor.java:227)
at com.kms.katalon.core.main.TestSuiteExecutor.accessTestCaseMainPhase(TestSuiteExecutor.java:129)
at com.kms.katalon.core.main.TestSuiteExecutor.accessTestSuiteMainPhase(TestSuiteExecutor.java:112)
at com.kms.katalon.core.main.TestSuiteExecutor.execute(TestSuiteExecutor.java:81)
at com.kms.katalon.core.main.TestCaseMain.startTestSuite(TestCaseMain.java:157)
at com.kms.katalon.core.main.TestCaseMain$startTestSuite$0.call(Unknown Source)
at TempTestSuite1554472756792.run(TempTestSuite1554472756792.groovy:35)

When the PendingException() is not thrown (commented out) this error never occurs and the test passes.