Skip to content

Commit 99380e0

Browse files
committed
Use canonical type names in conversion logging and error messages
Closes #4806
1 parent 43b87ad commit 99380e0

File tree

4 files changed

+72
-5
lines changed

4 files changed

+72
-5
lines changed

junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/execution/ParameterResolutionUtils.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ public class ParameterResolutionUtils {
157157

158158
logger.trace(
159159
() -> "ParameterResolver [%s] resolved a value of type [%s] for parameter [%s] in %s [%s].".formatted(
160-
resolver.getClass().getName(), (value != null ? value.getClass().getName() : null),
160+
resolver.getClass().getName(), (value != null ? value.getClass().getTypeName() : null),
161161
parameterContext.getParameter(), asLabel(executable), executable.toGenericString()));
162162

163163
return value;
@@ -198,8 +198,8 @@ private static void validateResolvedType(Parameter parameter, @Nullable Object v
198198
message = """
199199
ParameterResolver [%s] resolved a value of type [%s] for parameter [%s] \
200200
in %s [%s], but a value assignment compatible with [%s] is required.""".formatted(
201-
resolver.getClass().getName(), (value != null ? value.getClass().getName() : null), parameter,
202-
asLabel(executable), executable.toGenericString(), type.getName());
201+
resolver.getClass().getName(), (value != null ? value.getClass().getTypeName() : null), parameter,
202+
asLabel(executable), executable.toGenericString(), type.getTypeName());
203203
}
204204

205205
throw new ParameterResolutionException(message);

junit-jupiter-params/src/main/java/org/junit/jupiter/params/converter/TypedArgumentConverter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,12 @@ private T convert(@Nullable Object source, Class<?> actualTargetType) {
6868
}
6969
if (!this.sourceType.isInstance(source)) {
7070
String message = "%s cannot convert objects of type [%s]. Only source objects of type [%s] are supported.".formatted(
71-
getClass().getSimpleName(), source.getClass().getName(), this.sourceType.getName());
71+
getClass().getSimpleName(), source.getClass().getTypeName(), this.sourceType.getTypeName());
7272
throw new ArgumentConversionException(message);
7373
}
7474
if (!ReflectionUtils.isAssignableTo(this.targetType, actualTargetType)) {
7575
String message = "%s cannot convert to type [%s]. Only target type [%s] is supported.".formatted(
76-
getClass().getSimpleName(), actualTargetType.getName(), this.targetType.getName());
76+
getClass().getSimpleName(), actualTargetType.getTypeName(), this.targetType.getTypeName());
7777
throw new ArgumentConversionException(message);
7878
}
7979
return convert(this.sourceType.cast(source));

jupiter-tests/src/test/java/org/junit/jupiter/engine/execution/ParameterResolutionUtilsTests.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
import static java.util.Objects.requireNonNull;
1414
import static org.assertj.core.api.Assertions.assertThat;
15+
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
1516
import static org.junit.jupiter.api.Assertions.assertEquals;
1617
import static org.junit.jupiter.api.Assertions.assertNull;
1718
import static org.junit.jupiter.api.Assertions.assertSame;
@@ -250,6 +251,20 @@ void reportTypeMismatchBetweenParameterAndResolvedParameter() {
250251
// @formatter:on
251252
}
252253

254+
@Test
255+
void reportTypeMismatchBetweenParameterAndResolvedParameterWithArrayTypes() {
256+
testMethodWithASingleStringArrayParameter();
257+
thereIsAParameterResolverThatResolvesTheParameterTo(new int[][] {});
258+
259+
assertThatExceptionOfType(ParameterResolutionException.class)//
260+
.isThrownBy(this::resolveMethodParameters)//
261+
.withMessageContaining(//
262+
"resolved a value of type [int[][]] for parameter [java.lang.String[]", //
263+
"in method", //
264+
"but a value assignment compatible with [java.lang.String[]] is required." //
265+
);
266+
}
267+
253268
@Test
254269
void wrapAllExceptionsThrownDuringParameterResolutionIntoAParameterResolutionException() {
255270
anyTestMethodWithAtLeastOneParameter();
@@ -318,6 +333,10 @@ private void testMethodWithASingleStringParameter() {
318333
testMethodWith("singleStringParameter", String.class);
319334
}
320335

336+
private void testMethodWithASingleStringArrayParameter() {
337+
testMethodWith("singleStringArrayParameter", String[].class);
338+
}
339+
321340
private void testMethodWithASinglePrimitiveIntParameter() {
322341
testMethodWith("primitiveParameterInt", int.class);
323342
}
@@ -413,6 +432,8 @@ interface MethodSource {
413432

414433
void singleStringParameter(String parameter);
415434

435+
void singleStringArrayParameter(String[] parameter);
436+
416437
void primitiveParameterInt(int parameter);
417438

418439
void multipleParameters(String first, Integer second, Double third);

jupiter-tests/src/test/java/org/junit/jupiter/params/converter/TypedArgumentConverterTests.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,26 @@ void sourceTypeMismatch() {
8383
+ "Only source objects of type [java.lang.String] are supported.");
8484
}
8585

86+
@Test
87+
void sourceTypeMismatchForArrayType() {
88+
Parameter parameter = findParameterOfMethod("stringToByteArray", Byte[].class);
89+
ParameterContext parameterContext = parameterContext(parameter);
90+
assertThatExceptionOfType(ArgumentConversionException.class)//
91+
.isThrownBy(() -> this.converter.convert(new String[][] {}, parameterContext))//
92+
.withMessage("StringLengthArgumentConverter cannot convert objects of type [java.lang.String[][]]. "
93+
+ "Only source objects of type [java.lang.String] are supported.");
94+
}
95+
96+
@Test
97+
void sourceTypeMismatchForPrimitiveArrayType() {
98+
Parameter parameter = findParameterOfMethod("stringToByteArray", Byte[].class);
99+
ParameterContext parameterContext = parameterContext(parameter);
100+
assertThatExceptionOfType(ArgumentConversionException.class)//
101+
.isThrownBy(() -> this.converter.convert(new byte[0], parameterContext))//
102+
.withMessage("StringLengthArgumentConverter cannot convert objects of type [byte[]]. "
103+
+ "Only source objects of type [java.lang.String] are supported.");
104+
}
105+
86106
@Test
87107
void targetTypeMismatch() {
88108
Parameter parameter = findParameterOfMethod("stringToBoolean", Boolean.class);
@@ -93,6 +113,26 @@ void targetTypeMismatch() {
93113
+ "Only target type [java.lang.Integer] is supported.");
94114
}
95115

116+
@Test
117+
void targetTypeMismatchForArrayType() {
118+
Parameter parameter = findParameterOfMethod("stringToByteArray", Byte[].class);
119+
ParameterContext parameterContext = parameterContext(parameter);
120+
assertThatExceptionOfType(ArgumentConversionException.class)//
121+
.isThrownBy(() -> this.converter.convert("enigma", parameterContext))//
122+
.withMessage("StringLengthArgumentConverter cannot convert to type [java.lang.Byte[]]. "
123+
+ "Only target type [java.lang.Integer] is supported.");
124+
}
125+
126+
@Test
127+
void targetTypeMismatchForPrimitiveArrayType() {
128+
Parameter parameter = findParameterOfMethod("stringToPrimitiveByteArray", byte[].class);
129+
ParameterContext parameterContext = parameterContext(parameter);
130+
assertThatExceptionOfType(ArgumentConversionException.class)//
131+
.isThrownBy(() -> this.converter.convert("enigma", parameterContext))//
132+
.withMessage("StringLengthArgumentConverter cannot convert to type [byte[]]. "
133+
+ "Only target type [java.lang.Integer] is supported.");
134+
}
135+
96136
private ParameterContext parameterContext(Parameter parameter) {
97137
ParameterContext parameterContext = mock();
98138
when(parameterContext.getParameter()).thenReturn(parameter);
@@ -107,6 +147,12 @@ private Parameter findParameterOfMethod(String methodName, Class<?>... parameter
107147
void stringToBoolean(Boolean b) {
108148
}
109149

150+
void stringToByteArray(Byte[] array) {
151+
}
152+
153+
void stringToPrimitiveByteArray(byte[] array) {
154+
}
155+
110156
}
111157

112158
/**

0 commit comments

Comments
 (0)