Skip to content

Commit 06516ae

Browse files
sbrannenmarcphilipp
authored andcommitted
Use canonical type names in conversion logging and error messages
Closes #4806
1 parent 1d06157 commit 06516ae

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
@@ -144,7 +144,7 @@ private static Object resolveParameter(ParameterContext parameterContext, Execut
144144

145145
logger.trace(() -> String.format(
146146
"ParameterResolver [%s] resolved a value of type [%s] for parameter [%s] in %s [%s].",
147-
resolver.getClass().getName(), (value != null ? value.getClass().getName() : null),
147+
resolver.getClass().getName(), (value != null ? value.getClass().getTypeName() : null),
148148
parameterContext.getParameter(), asLabel(executable), executable.toGenericString()));
149149

150150
return value;
@@ -185,8 +185,8 @@ private static void validateResolvedType(Parameter parameter, Object value, Exec
185185
message = String.format(
186186
"ParameterResolver [%s] resolved a value of type [%s] for parameter [%s] "
187187
+ "in %s [%s], but a value assignment compatible with [%s] is required.",
188-
resolver.getClass().getName(), (value != null ? value.getClass().getName() : null), parameter,
189-
asLabel(executable), executable.toGenericString(), type.getName());
188+
resolver.getClass().getName(), (value != null ? value.getClass().getTypeName() : null), parameter,
189+
asLabel(executable), executable.toGenericString(), type.getTypeName());
190190
}
191191

192192
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
@@ -64,12 +64,12 @@ private T convert(Object source, Class<?> actualTargetType) {
6464
if (!this.sourceType.isInstance(source)) {
6565
String message = String.format(
6666
"%s cannot convert objects of type [%s]. Only source objects of type [%s] are supported.",
67-
getClass().getSimpleName(), source.getClass().getName(), this.sourceType.getName());
67+
getClass().getSimpleName(), source.getClass().getTypeName(), this.sourceType.getTypeName());
6868
throw new ArgumentConversionException(message);
6969
}
7070
if (!ReflectionUtils.isAssignableTo(this.targetType, actualTargetType)) {
7171
String message = String.format("%s cannot convert to type [%s]. Only target type [%s] is supported.",
72-
getClass().getSimpleName(), actualTargetType.getName(), this.targetType.getName());
72+
getClass().getSimpleName(), actualTargetType.getTypeName(), this.targetType.getTypeName());
7373
throw new ArgumentConversionException(message);
7474
}
7575
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
@@ -11,6 +11,7 @@
1111
package org.junit.jupiter.engine.execution;
1212

1313
import static org.assertj.core.api.Assertions.assertThat;
14+
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
1415
import static org.junit.jupiter.api.Assertions.assertEquals;
1516
import static org.junit.jupiter.api.Assertions.assertNull;
1617
import static org.junit.jupiter.api.Assertions.assertSame;
@@ -241,6 +242,20 @@ void reportTypeMismatchBetweenParameterAndResolvedParameter() {
241242
// @formatter:on
242243
}
243244

245+
@Test
246+
void reportTypeMismatchBetweenParameterAndResolvedParameterWithArrayTypes() {
247+
testMethodWithASingleStringArrayParameter();
248+
thereIsAParameterResolverThatResolvesTheParameterTo(new int[][] {});
249+
250+
assertThatExceptionOfType(ParameterResolutionException.class)//
251+
.isThrownBy(this::resolveMethodParameters)//
252+
.withMessageContaining(//
253+
"resolved a value of type [int[][]] for parameter [java.lang.String[]", //
254+
"in method", //
255+
"but a value assignment compatible with [java.lang.String[]] is required." //
256+
);
257+
}
258+
244259
@Test
245260
void wrapAllExceptionsThrownDuringParameterResolutionIntoAParameterResolutionException() {
246261
anyTestMethodWithAtLeastOneParameter();
@@ -309,6 +324,10 @@ private void testMethodWithASingleStringParameter() {
309324
testMethodWith("singleStringParameter", String.class);
310325
}
311326

327+
private void testMethodWithASingleStringArrayParameter() {
328+
testMethodWith("singleStringArrayParameter", String[].class);
329+
}
330+
312331
private void testMethodWithASinglePrimitiveIntParameter() {
313332
testMethodWith("primitiveParameterInt", int.class);
314333
}
@@ -412,6 +431,8 @@ interface MethodSource {
412431

413432
void singleStringParameter(String parameter);
414433

434+
void singleStringArrayParameter(String[] parameter);
435+
415436
void primitiveParameterInt(int parameter);
416437

417438
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
@@ -79,6 +79,26 @@ void sourceTypeMismatch() {
7979
+ "Only source objects of type [java.lang.String] are supported.");
8080
}
8181

82+
@Test
83+
void sourceTypeMismatchForArrayType() {
84+
Parameter parameter = findParameterOfMethod("stringToByteArray", Byte[].class);
85+
ParameterContext parameterContext = parameterContext(parameter);
86+
assertThatExceptionOfType(ArgumentConversionException.class)//
87+
.isThrownBy(() -> this.converter.convert(new String[][] {}, parameterContext))//
88+
.withMessage("StringLengthArgumentConverter cannot convert objects of type [java.lang.String[][]]. "
89+
+ "Only source objects of type [java.lang.String] are supported.");
90+
}
91+
92+
@Test
93+
void sourceTypeMismatchForPrimitiveArrayType() {
94+
Parameter parameter = findParameterOfMethod("stringToByteArray", Byte[].class);
95+
ParameterContext parameterContext = parameterContext(parameter);
96+
assertThatExceptionOfType(ArgumentConversionException.class)//
97+
.isThrownBy(() -> this.converter.convert(new byte[0], parameterContext))//
98+
.withMessage("StringLengthArgumentConverter cannot convert objects of type [byte[]]. "
99+
+ "Only source objects of type [java.lang.String] are supported.");
100+
}
101+
82102
@Test
83103
void targetTypeMismatch() {
84104
Parameter parameter = findParameterOfMethod("stringToBoolean", Boolean.class);
@@ -89,6 +109,26 @@ void targetTypeMismatch() {
89109
+ "Only target type [java.lang.Integer] is supported.");
90110
}
91111

112+
@Test
113+
void targetTypeMismatchForArrayType() {
114+
Parameter parameter = findParameterOfMethod("stringToByteArray", Byte[].class);
115+
ParameterContext parameterContext = parameterContext(parameter);
116+
assertThatExceptionOfType(ArgumentConversionException.class)//
117+
.isThrownBy(() -> this.converter.convert("enigma", parameterContext))//
118+
.withMessage("StringLengthArgumentConverter cannot convert to type [java.lang.Byte[]]. "
119+
+ "Only target type [java.lang.Integer] is supported.");
120+
}
121+
122+
@Test
123+
void targetTypeMismatchForPrimitiveArrayType() {
124+
Parameter parameter = findParameterOfMethod("stringToPrimitiveByteArray", byte[].class);
125+
ParameterContext parameterContext = parameterContext(parameter);
126+
assertThatExceptionOfType(ArgumentConversionException.class)//
127+
.isThrownBy(() -> this.converter.convert("enigma", parameterContext))//
128+
.withMessage("StringLengthArgumentConverter cannot convert to type [byte[]]. "
129+
+ "Only target type [java.lang.Integer] is supported.");
130+
}
131+
92132
private ParameterContext parameterContext(Parameter parameter) {
93133
ParameterContext parameterContext = mock();
94134
when(parameterContext.getParameter()).thenReturn(parameter);
@@ -103,6 +143,12 @@ private Parameter findParameterOfMethod(String methodName, Class<?>... parameter
103143
void stringToBoolean(Boolean b) {
104144
}
105145

146+
void stringToByteArray(Byte[] array) {
147+
}
148+
149+
void stringToPrimitiveByteArray(byte[] array) {
150+
}
151+
106152
}
107153

108154
/**

0 commit comments

Comments
 (0)