es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Junit 5 – ¿Cómo pasar varios valores nulos para @MethodSource?

Muy similar a cómo pasar múltiples valores nulos para CSVSource

Estoy modificando un método de prueba de parámetro único a múltiple:

@ParameterizedTest
@NullAndEmptySource
@MethodSource("generateData")
void testSomeMethod(String x, List<string> list) {
  doSomethingwith(x);
  doAnotherThingWith(list);
}

private static Stream<arguments> generateData() {
    return Stream.of(
        Arguments.of("a", Arrays.asList("1","2","3")),
        Arguments.of("b", Arrays.asList("1","2","3")),
        Arguments.of("foo", Arrays.asList("1","2","3"))
    );
}

La prueba de caso nulo y vacío agregada con esta anotación @NullAndEmptySource falló con una ParameterResolutionException: No hay un parámetro registrado para el parámetro [java.util.List<java.lang.String> arg1 en el método [public void my.pachage.myclass.testSomeMethod]

¿Alguien podría guiarme para pasar el caso de prueba? No tengo idea si los parámetros coinciden porque hay dos parámetros en el método y no entiendo qué significa el mensaje de error.

Tags:  ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que JUnit 5 no puede encontrar un resolvedor de argumento adecuado para el segundo parámetro del método testSomeMethod(), el cual es de tipo List<string>. Esto se debe a que JUnit 5 no brinda soporte incorporado para parámetros de tipo List en las Pruebas Parametrizadas.

    Para solucionar este problema, puedes escribir un resolvedor de argumento personalizado que pueda convertir una String separada por comas en una List<string>. Aquí tienes un ejemplo de implementación:

    public class StringToListArgumentResolver implements ArgumentResolver {
    
      @Override
      public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext)
          throws ParameterResolutionException {
        return parameterContext.getParameter().getType() == List.class;
      }
    
      @Override
      public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext)
          throws ParameterResolutionException {
        Parameter parameter = parameterContext.getParameter();
        String stringValue = parameterContext.getArguments().get(0).toString();
        List<string> listValue = Arrays.asList(stringValue.split(","));
        return listValue;
      }
    }
    

    Luego, puedes registrar este resolvedor de argumento en tu clase de prueba anotando la clase con @ExtendWith(StringToListArgumentResolver.class):

    @ExtendWith(StringToListArgumentResolver.class)
    public class MyTest {
    
      @ParameterizedTest
      @NullAndEmptySource
      @MethodSource("generateData")
      void testSomeMethod(String x, List<string> list) {
        // ...
      }
    
      private static Stream<arguments> generateData() {
        // ...
      }
    }
    

    Con esta configuración, el resolvedor de argumento StringToListArgumentResolver se invocará cada vez que JUnit 5 encuentre un parámetro List en una Prueba Parametrizada. El resolvedor dividirá el argumento String separado por comas en una List<string>, la cual se pasará al método de prueba.

Comments are closed.