2017-10-20 36 views
2

J'ai un test dans lequel je veux passer trois paramètres:Junit5 @ParameterizedTest Comment passer un tableau comme paramètre

  1. cordes
  2. Enum
  3. Tableau de chaînes

Exemple:

@ParameterizedTest 
    @CsvSource({ 
      "/path/to/first/file.xlsx, FIRST, {THIRD PARAMETER SHOULD BE ARRAY OF STRINGS}", 
      "/path/to/second/file.xlsx, SECOND, {THIRD PARAMETER SHOULD BE ARRAY OF STRINGS}"}) 
    void uploadFile(String path, FileType type, String[] errors) { 
     HttpEntity httpEntity = prepareFileUploadEntity(path, type); 

     ResponseEntity<ArrayList> response = getRestTemplate(AppRole.USER).exchange(UPLOAD_URL, HttpMethod.POST, httpEntity, ArrayList.class); 

     assertNotNull(response); 
     assertEquals(HttpStatus.BAD_REQUEST, response.getStatusCode()); 
     assertEquals(errors.length, response.getBody().size()); 
     for (String error : errors) { 
      assertTrue(response.getBody().contains(error)); 
     } 
    } 

Comment puis-je pa ss le troisième paramètre comme un tableau de chaînes, faire maintenant, j'ai l'erreur que troisième paramètre `t être résolu:

org.junit.jupiter.api.extension.ParameterResolutionException: Error resolving parameter at index 2 

Répondre

0

Petite correction, dans

return ((String) source).split("\\s*,\\s*"); 

devrait être un signe différent (par ex. ';') Au lieu de ''

Ensuite, dans le test devrait être

@ParameterizedTest 
@CsvSource("abc, 123, foo; bar") 

Version finale qui fonctionne pour moi:

import org.junit.jupiter.params.converter.ArgumentConversionException; 
import org.junit.jupiter.params.converter.SimpleArgumentConverter; 

public class StringArrayConverter extends SimpleArgumentConverter { 

    @Override 
    protected Object convert(Object source, Class<?> targetType) throws ArgumentConversionException { 
     if (source instanceof String && String[].class.isAssignableFrom(targetType)) { 
      return ((String) source).split("\\s*;\\s*"); 
     } else { 
      throw new IllegalArgumentException("Conversion from " + source.getClass() + " to " 
               + targetType + " not supported."); 
     } 
    } 

} 

Test:

@ParameterizedTest 
@CsvSource("abc, 123, foo; bar") 
void test(String column1, int column2, @ConvertWith(StringArrayConverter.class) String[] column3) { 
    assertEquals(column1, "abc"); 
    assertEquals(column2, 123); 
    assertEquals(column3[0], "foo"); 
    assertEquals(column3[1], "bar"); 
} 
+0

"correction" n'est pas nécessaire. À mon avis, il est préférable d'indiquer le "tableau" comme dans Kapep répondre à l'intérieur d'une seule chaîne entre guillemets –

3

@CsvSource utilise implicit conversion pour convertir les valeurs CSV primitives, énumérations ou dates. Pour les autres types comme Arrays, vous avez besoin de explicit conversion.

En supposant que vous avez une annotation CSV dans un format comme @CsvSource("abc, 123, 'foo, bar'"), vous pouvez mettre en œuvre un convertisseur argument comme celui-ci pour traiter la dernière colonne CSV comme un tableau:

import org.junit.jupiter.params.converter.ArgumentConversionException; 
import org.junit.jupiter.params.converter.SimpleArgumentConverter; 

public class StringArrayConverter extends SimpleArgumentConverter { 

    @Override 
    protected Object convert(Object source, Class<?> targetType) throws ArgumentConversionException { 
     if (source instanceof String && String[].class.isAssignableFrom(targetType)) { 
      return ((String) source).split("\\s*,\\s*"); 
     } else { 
      throw new IllegalArgumentException("Conversion from " + source.getClass() + " to " 
               + targetType + " not supported."); 
     } 
    } 

} 

Ensuite, vous pouvez utiliser ce convertisseur le troisième Argument:

@ParameterizedTest 
@CsvSource("abc, 123, 'foo, bar'") 
void test(String column1, int column2, @ConvertWith(StringArrayConverter.class) String[] column3) { 
    assertEquals(column1, "abc"); 
    assertEquals(column2, 123); 
    assertEquals(column3[0], "foo"); 
    assertEquals(column3[1], "bar"); 
} 
+0

Merci beaucoup! –