JUnit5 - @CsvSource - conversión de fuente a POJO

Pijotrek:

He estado siguiendo algún curso en línea sobre las pruebas JUnit y me encontré con un ejemplo de @CsvSource. Siguiendo el ejemplo funciona muy bien.

@DisplayName("CSV input test")
@ParameterizedTest(name = DISPLAY_NAME_PLACEHOLDER + " - [" + INDEX_PLACEHOLDER + "] " + ARGUMENTS_PLACEHOLDER)
@CsvSource({
        "FL, 1, 1",
        "OH, 2, 2",
        "MI, 3, 3"
})
void csvInputTest(String stateCode, int val1, int val2) {
    System.out.println(stateCode + " - " + val1 + " - " + val2);
}

Y empecé a preguntarme si podría utilizar un poco de POJO en lugar de bazilion de argumentos. Así que creé la clase POJO con setters y getters y cambiado de método a:

void csvInputTest(StateInfo stateInfo) {
    System.out.println(stateInfo.getStateCode() + " - " + stateInfo.getVal1() + " - " + stateInfo.getVal2());
}

pero esto resultó en:

org.junit.jupiter.api.extension.ParameterResolutionException: Error converting parameter at index 0: No implicit conversion to convert object of type java.lang.String to type StateInfo

No pude encontrar ningún campo @CsvSourcepara especificar cualquier convertidor así que mi pregunta es - yo soy capaz de hacerlo? ¿O tengo que atenerse a N-argumentsenfoque?

davidxxx:

La documentación oficial explica que:

Para utilizar un agregador de costumbre, implementar la interfaz ArgumentsAggregator y registrarlo a través de la anotación @AggregateWith en un parámetro compatible en el método @ParameterizedTest. El resultado de la agregación a continuación, se proporciona como un argumento para el parámetro correspondiente cuando se invoca la prueba parametrizado. Tenga en cuenta que una implementación de ArgumentsAggregator se debe declarar ya sea como una clase de nivel superior o como una clase anidada estática.

Se daría:

public class StateInfoAggregator implements ArgumentsAggregator {
    @Override
    public StateInfo aggregateArguments(ArgumentsAccessor arguments, ParameterContext context) {
        return new StateInfo(arguments.getString(0),
                             arguments.getInteger(1),
                             arguments.getInteger(1));

    }
}

@ParameterizedTest
@CsvSource({
        "FL, 1, 1",
        "OH, 2, 2",
        "MI, 3, 3"
})
void csvInputTest(@AggregateWith(StateInfoAggregator.class) StateInfo stateInfo) {
    System.out.println(stateInfo.getStateCode() + " - " + stateInfo.getVal1() + " - " + stateInfo.getVal2());
}

La documentación también añade:

Si usted se encuentra en varias ocasiones declarando @AggregateWith (MyTypeAggregator.class) para varios métodos de prueba parametrizados a través de su base de código, es posible que desee crear una anotación compuesta personalizada, como @CsvToMyType que es meta-anotado con @AggregateWith (MyTypeAggregator.class).

Se daría:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
@AggregateWith(StateInfoAggregator.class)
public @interface CsvToStateInfo {
}

@ParameterizedTest
@CsvSource({
        "FL, 1, 1",
        "OH, 2, 2",
        "MI, 3, 3"
})
void csvInputTest(@CsvToStateInfo  StateInfo stateInfo) {
    System.out.println(stateInfo.getStateCode() + " - " + stateInfo.getVal1() + " - " + stateInfo.getVal2());
}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=201763&siteId=1
Recomendado
Clasificación