15

I have the following feature file: MacroValidation.feature

@macroFilter
Feature: Separating out errors and warnings
Scenario: No errors or warnings when separating out error list
    Given I have 0 macros
    When I filter out errors and warnings for Macros
    Then I need to have 0 errors
        And I need to have 0 warnings

My definition files.

package com.test.definition;

import cucumber.api.java.After;
import cucumber.api.java.Before;
import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
import cucumber.api.java.en.When;
import cucumber.runtime.java.StepDefAnnotation;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.powermock.api.mockito.PowerMockito.doReturn;
import static org.powermock.api.mockito.PowerMockito.mock;
import static org.powermock.api.mockito.PowerMockito.spy;


@StepDefAnnotation
public class MacroValidationStepDefinitions {

private final MacroService macroService = spy(new MacroService());
private final LLRBusList busList = mock(LLRBusList.class);    
private final List<String> errorList = new ArrayList<String>();
private final List<String> warningList = new ArrayList<String>();

@Before({"@macroFilter"})
public void setUp() {
    errorList.addAll(Arrays.asList("error 1, error2, error 3"));
    warningList.addAll(Arrays.asList("warning 1, warning 2, warning 3"));
}

@After({"@macroFilter"})
public void tearDown() {
    errorList.clear();
    warningList.clear();
}

@Given("^I have (\\d+) macros$")
public void i_have_macros(int input) {
    doReturn(input).when(busList).size();
}

@When("^I filtered out errors and warnings for Macros$")
public void i_filtered_out_errors_and_warnings_for_Macros() {
    macroService.separateErrorsAndWarning(busList, errorList, warningList);
}

@Then("^I need to have (\\d+) errors$")
public void  i_need_to_have_errors(int numOfError) {
    if (numOfError == 0) {
        assertTrue(errorList.isEmpty());
    } else {
        assertEquals(errorList.size(), numOfError);
    }
}

@Then("^I need to have (\\d+) warnings$")
public void  i_need_to_have_warnings(int numOfWarnings) {
    if (numOfWarnings == 0) {
        assertTrue(warningList.isEmpty());
    } else {
        assertEquals(warningList.size(), numOfWarnings);
    }
}
}

My unit test class.

@CucumberOptions(features = {"classpath:testfiles/MacroValidation.feature"},
                 glue = {"com.macro.definition"},
                 dryRun = false, 
                 monochrome = true,
                 tags = "@macroFilter"
                 )
@RunWith(Cucumber.class)
public class PageMacroValidationTest {
}

When I execute the test, I get file definition not implemented warnings in the log.

Example log:

You can implement missing steps with the snippets below:

@Given("^I have (\\d+) macros$")
public void i_have_macros(int arg1) throws Throwable {
    // Write code here that turns the phrase above into concrete actions
    throw new PendingException();
}

@When("^I filter out errors and warnings for Macros$")
public void i_filter_out_errors_and_warnings_for_Macros() throws Throwable {
    // Write code here that turns the phrase above into concrete actions
    throw new PendingException();
}

@Then("^I need to have (\\d+) errors$")
public void i_need_to_have_errors(int arg1) throws Throwable {
    // Write code here that turns the phrase above into concrete actions
    throw new PendingException();
}

@Then("^I need to have (\\d+) warnings$")
public void i_need_to_have_warnings(int arg1) throws Throwable {
    // Write code here that turns the phrase above into concrete actions
    throw new PendingException();
}

I don't think file name should matter right?

Sled
  • 18,541
  • 27
  • 119
  • 168
Chun ping Wang
  • 3,879
  • 12
  • 42
  • 53
  • http://stackoverflow.com/questions/21753267/cucumber-jvm-undefined-step/21754450#21754450 – Bala Jun 19 '14 at 13:59

3 Answers3

15

It looks like Cucumber isn't finding your step defintion class. In your unit test class you say:

 glue = {"com.macro.definition"}

However the step definition classes are in com.test.definition

Try changing that line to:

 glue = {"com.test.definition"}

You may have to rebuild your project to pick up the change.

Grant Winney
  • 65,241
  • 13
  • 115
  • 165
Matt Watson
  • 5,065
  • 4
  • 30
  • 48
3

Also, Cucumber is sensitive to white space. If you try to make your runner or feature file pretty after having captured the snippets, you will get this problem.

Here's an example that drove me nuts for several hours while creating my first BDD. I had created the feature file and a skeleton runner which I ran and and captured the snippets. Then I prettified the feature file, and when I ran the runner got the errors.

Of course everything looked fine to my human brain, so the next few hours were spent in fruitless research here, and checking versions and bug lists. Finally I decided to compare the first two lines of the snippet to see what was different:

//  @Then("^the test result is = \"([^\"]*)\"$")
//  public void theTestResultIs(String ruleResult) throws Throwable {
    @Then("^the test result is         = \"([^\"]*)\"$")
    public void theTestResultIs(String arg1) throws Throwable {

Doh!

JeffInTampa
  • 55
  • 1
  • 10
0

Try to use all dependencies in POM.xml with io.cucumber group id which is the latest jars instead of info.cukes. After removing jars update the project with new imports and run the project.

Remember you have to replace all dependencies of info.cukes with io.cucumber