From 6d68f7a52c9886b8dbd835ee7d9f639fdf1e4545 Mon Sep 17 00:00:00 2001 From: Uladzislau Arlouski Date: Fri, 24 Oct 2025 12:33:50 +0300 Subject: [PATCH] JBEHAVE-1611 Add ability to use Parameter annotation in parent classes --- .../jbehave/core/steps/ConvertedParameters.java | 12 +++++++++++- .../core/steps/ConvertedParametersBehaviour.java | 14 ++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/jbehave-core/src/main/java/org/jbehave/core/steps/ConvertedParameters.java b/jbehave-core/src/main/java/org/jbehave/core/steps/ConvertedParameters.java index 8b9877586..c092c9e6e 100755 --- a/jbehave-core/src/main/java/org/jbehave/core/steps/ConvertedParameters.java +++ b/jbehave-core/src/main/java/org/jbehave/core/steps/ConvertedParameters.java @@ -115,7 +115,7 @@ private static Optional findField(Class type, String name, Map field = Stream.of(type.getDeclaredFields()) + Optional field = getAllFields(type) .filter(f -> f.isAnnotationPresent(Parameter.class)) .filter(f -> fieldName.equals(f.getAnnotation(Parameter.class).name())) .findFirst(); @@ -137,6 +137,16 @@ private static Optional findField(Class type, String fieldName) { return Optional.empty(); } + private static Stream getAllFields(Class type) { + if (type == Object.class) { + return Stream.empty(); + } + return Stream.concat( + Stream.of(type.getDeclaredFields()), + getAllFields(type.getSuperclass()) + ); + } + @SuppressWarnings("unchecked") private T convert(String value, Type type) { return (T) parameterConverters.convert(value, type); diff --git a/jbehave-core/src/test/java/org/jbehave/core/steps/ConvertedParametersBehaviour.java b/jbehave-core/src/test/java/org/jbehave/core/steps/ConvertedParametersBehaviour.java index ae4cb952a..bbd946d1a 100755 --- a/jbehave-core/src/test/java/org/jbehave/core/steps/ConvertedParametersBehaviour.java +++ b/jbehave-core/src/test/java/org/jbehave/core/steps/ConvertedParametersBehaviour.java @@ -89,6 +89,7 @@ void shouldConvertParametersToTypeWithFieldMapping() { row.put("firstName", "Boba"); row.put("l_name", "Fett"); row.put("identifier", "boba-fett-clone"); + row.put("idx", "1"); Parameters parameters = new ConvertedParameters(row, converters); @@ -100,6 +101,7 @@ void shouldConvertParametersToTypeWithFieldMapping() { assertThat(person.getAge(), is(53)); assertThat(person.getFirstName(), is("Boba")); assertThat(person.getLastName(), is("Fett")); + assertThat(person.getIndex(), is(1)); } @Test @@ -119,6 +121,7 @@ void shouldConvertParametersToPersonType() { row.put("years", "38"); row.put("firstName", "Din"); row.put("l_name", "Djarin"); + row.put("idx", "1"); converters.addConverters(new ParametersToPersonConverter()); Parameters parameters = new ConvertedParameters(row, converters); @@ -128,16 +131,26 @@ void shouldConvertParametersToPersonType() { assertThat(person.getAge(), is(38)); assertThat(person.getFirstName(), is("Din")); assertThat(person.getLastName(), is("Djarin")); + assertThat(person.getIndex(), is(1)); } public static class Identifier { private String identifier; + @Parameter(name = "idx") + private int index; public String getIdentifier() { return identifier; } + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } } public static final class ParametersToPersonConverter extends AbstractParameterConverter { @@ -148,6 +161,7 @@ public Person convertValue(Parameters value, Type type) { person.setAge(value.valueAs("years", int.class)); person.setFirstName(value.valueAs("firstName", String.class)); person.setLastName(value.valueAs("l_name", String.class)); + person.setIndex(value.valueAs("idx", Integer.class)); return person; }