Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Date object in Cucumber

I have a cucumber stepdef like this

Given the date of <date>
When blah blah
Then x y and z
Examples:
|2015-01-01|
|2045-01-01|

When I generate stepdefs off of this, I get @Given("^the date of (\\d+)-(\\d+)-(\\d+)$") And the method is generated with three integers as parameters. How can I tell Cucumber to treat it like a Java.Time LocalDate? Is there a way to create a mapper that Cucumber will understand? Or at the very least, is there a way to treat that date object as a string instead of three numbers?

like image 682
Steve Avatar asked Dec 15 '22 03:12

Steve


2 Answers

Modify your step definition to take in a String for the whole date. Maybe use something like (.*?) instead of 3 integers.

@Given("^the date of (.*?)$")
public void storeDate(@Transform(DateMapper.class) LocalDate date){

}

Transformer class

public class DateMapper extends Transformer<LocalDate>{

    @Override
    public LocalDate transform(String date) {

        //Not too sure about the date pattern though, check it out if it gives correct result
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

        return LocalDate.parse(date, formatter); 
   }

}

Cucumber should transform the string format into a date object for you

like image 91
Grasshopper Avatar answered Dec 24 '22 04:12

Grasshopper


With Cucumber 7, I'm defining a new @ParameterType :

@ParameterType("\\d{2}\\.\\d{2}\\.\\d{4}")
public LocalDate mydate(String dateString) {
    return LocalDate.parse(dateString, DateTimeFormatter.ofPattern("dd.MM.yyyy"));
}

Then I can use step definition @Given such as :

@Given("person has birthdate {mydate}")
public void person_birthdate(LocalDate birthDate) {
    ... // do something
}

The placeholder name {mydate} is the name of the mapping method, but you can override it through @ParameterType.name.

like image 41
Julien Kronegg Avatar answered Dec 24 '22 03:12

Julien Kronegg