Cucumber DataTable
How to use Cucumber DataTable to create mock tests.
Previously I wrote about setting up Cucumber in IntelliJ.
In a feature file you can create a mock test for an input and assert an output.
For example, an application that reads lines from a text, and extracts specific content, for instance, extract all the numbers from the text.
The .feature
file could be the following:
Feature: Extract Digits From File
Scenario: Extract digits from a text file
Given I have a text file
| Mash at 152F for 60 mins |
| Using Pilsner malt at 82% and 7% Vienna malt. |
| With an ABV of 7% |
When I extract the digits from the file
Then A list of digits is extracted
| 152 | 60 | 82 | 7 | 7 |
In the steps class file, Given
has:
List<List<String>> textFileData;
@Given("I have a text file")
public void i_have_a_text_file(DataTable dataTable) {
textFileData = new ArrayList<>(dataTable.asLists());
}
If you look at the source code for DataTable
, it creates an object of type List<List<String>>
. You can convert this object into an ArrayList
. If you print textFileData
in the above example, it will print:
[ [Mash at 152F for 60 mins], [Using Pilsner malt at 82% and 7% Vienna malt.], [With an ABV of 7%] ]
In the steps class file. Then
has:
@Then("A list of digits is extracted")
public void a_list_of_digits_is_extracted(DataTable dataTable) {
List<Integer> expectedDigits = dataTable.asLists()
.get(0)
.stream()
.map(Integer::parseInt)
.toList();
The method asLists()
converts dataTable
to an object of type List<List<String>>
. You can do the comparison of objects by printing this:
System.out.println(dataTable.getClass());
System.out.println(dataTable.asLists().getClass());
If you print dataTable.asLists()
in the example above, you will get a list of lists with one element:
[ [152, 60 , 82 , 7 , 7 ] ]
These aren’t of type int
or Integer
though. You can extract the first element in this array with .get(0)
, convert it to a stream .stream()
, map each string number to an Integer .map(Integer::parseInt)
, and convert it back to a list .toList()
.
Printing expectedDigits
will result in a List<Integer>
:
[152, 60 , 82 , 7 , 7 ]