This trait register a `DefaultDataTableEntryTransformer` using Jackson `ObjectMapper`.
+ * + *The `[empty]` string is used as default empty string replacement. You can override it if you need to.
+ * + *Note: Jackson is not included with Cucumber Scala, you have to add the dependency: + * `com.fasterxml.jackson.module:jackson-module-scala_2.xx` + * to your project if you want to use this trait.
+ */ +trait JacksonDefaultDataTableEntryTransformer extends ScalaDsl { + + /** + * Define the string to be used as replacement for empty. + * Default is `[empty]`. + */ + def emptyStringReplacement: String = "[empty]" + + /** + * Create the Jackson ObjectMapper to be used. + * Default is a simple ObjectMapper with DefaultScalaModule registered. + */ + def createObjectMapper(): ObjectMapper = { + val objectMapper = new ObjectMapper() + objectMapper.registerModule(DefaultScalaModule) + } + + private lazy val objectMapper: ObjectMapper = createObjectMapper() + + DefaultDataTableEntryTransformer(emptyStringReplacement) { (fromValue: Map[String, String], toValueType: java.lang.reflect.Type) => + objectMapper.convertValue[AnyRef](fromValue, objectMapper.constructType(toValueType)) + } + +} diff --git a/scala/sources/src/test/resources/tests/jackson/Jackson.feature b/scala/sources/src/test/resources/tests/jackson/Jackson.feature new file mode 100644 index 00000000..09e41023 --- /dev/null +++ b/scala/sources/src/test/resources/tests/jackson/Jackson.feature @@ -0,0 +1,15 @@ +Feature: As Cucumber Scala, I want to provide a basic DataTable transformer using Jackson + + Scenario: Use the default transformer with a basic case class + Given I have the following datatable + | field1 | field2 | field3 | + | 1.2 | true | abc | + | 2.3 | false | def | + | 3.4 | true | ghj | + + Scenario: Use the default transformer with a basic case class and empty values + Given I have the following datatable, with an empty value + | field1 | field2 | field3 | + | 1.2 | true | abc | + | 2.3 | false | [blank] | + | 3.4 | true | ghj | \ No newline at end of file diff --git a/scala/sources/src/test/scala/tests/jackson/JacksonSteps.scala b/scala/sources/src/test/scala/tests/jackson/JacksonSteps.scala new file mode 100644 index 00000000..b7a934ff --- /dev/null +++ b/scala/sources/src/test/scala/tests/jackson/JacksonSteps.scala @@ -0,0 +1,31 @@ +package tests.jackson + +import io.cucumber.scala.{EN, JacksonDefaultDataTableEntryTransformer, ScalaDsl} + +import scala.collection.JavaConverters._ + +case class MyCaseClass(field1: Double, field2: Boolean, field3: String) + +class JacksonSteps extends ScalaDsl with EN with JacksonDefaultDataTableEntryTransformer { + + override def emptyStringReplacement: String = "[blank]" + + Given("I have the following datatable") { (data: java.util.List[MyCaseClass]) => + val expected = Seq( + MyCaseClass(1.2, true, "abc"), + MyCaseClass(2.3, false, "def"), + MyCaseClass(3.4, true, "ghj") + ) + assert(data.asScala == expected) + } + + Given("I have the following datatable, with an empty value") { (data: java.util.List[MyCaseClass]) => + val expected = Seq( + MyCaseClass(1.2, true, "abc"), + MyCaseClass(2.3, false, ""), + MyCaseClass(3.4, true, "ghj") + ) + assert(data.asScala == expected) + } + +} diff --git a/scala/sources/src/test/scala/tests/jackson/RunJacksonTest.scala b/scala/sources/src/test/scala/tests/jackson/RunJacksonTest.scala new file mode 100644 index 00000000..2efc18c5 --- /dev/null +++ b/scala/sources/src/test/scala/tests/jackson/RunJacksonTest.scala @@ -0,0 +1,8 @@ +package tests.jackson + +import io.cucumber.junit.{Cucumber, CucumberOptions} +import org.junit.runner.RunWith + +@RunWith(classOf[Cucumber]) +@CucumberOptions(strict = true) +class RunJacksonTest