import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.converter.ArgumentConversionException;
import org.junit.jupiter.params.converter.ArgumentConverter;
import org.junit.jupiter.params.converter.ConvertWith;
import org.junit.jupiter.params.provider.ValueSource;
class Temperature {
private final double celsius;
public Temperature(double celsius) {
this.celsius = celsius;
}
public double getCelsius() {
return celsius;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Temperature other = (Temperature) obj;
return Double.compare(other.celsius, celsius) == 0;
}
@Override
public int hashCode() {
return Double.hashCode(celsius);
}
}
class TemperatureConverter implements ArgumentConverter {
@Override
public Object convert(Object source, java.lang.reflect.Parameter context) throws ArgumentConversionException {
if (!(source instanceof String)) {
throw new ArgumentConversionException("Can only convert from String");
}
String str = (String) source;
try {
// Assume input like "36.5C" - remove 'C' and parse double
if (!str.endsWith("C")) {
throw new ArgumentConversionException("String must end with 'C'");
}
double value = Double.parseDouble(str.substring(0, str.length() - 1));
return new Temperature(value);
} catch (NumberFormatException e) {
throw new ArgumentConversionException("Invalid temperature format", e);
}
}
}
public class ArgumentConversionTest {
@ParameterizedTest
@ValueSource(strings = {"36.5C", "0C", "100C"})
void testTemperatureConversion(@ConvertWith(TemperatureConverter.class) Temperature temp) {
Assertions.assertNotNull(temp);
// Check that the celsius value matches expected values
String input = temp.getCelsius() + "C";
Assertions.assertTrue(input.endsWith("C"));
}
}This test uses JUnit 5's parameterized test feature with @ValueSource to provide string inputs representing temperatures.
The TemperatureConverter class implements ArgumentConverter to convert the input string (like "36.5C") into a Temperature object by parsing the numeric part.
The test method testTemperatureConversion uses @ConvertWith to apply this converter to the parameter. Inside the test, assertions check that the converted object is not null and that the value ends with 'C', confirming correct conversion.
This approach keeps the test clean and focused on verifying argument conversion works as expected.