2017-10-20 202 views
2

我具有其中欲測試的一個傳遞三個參數:Junit5 @ParameterizedTest如何通過數組作爲參數

  1. 字符串
  2. 枚舉的字符串
  3. 陣列

例如:

@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)); 
     } 
    } 

我該怎麼辦SS第三個參數爲一個字符串數組,因爲現在我有錯誤第三參數`噸來解決:

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

回答

0

小幅盤整,在

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

應該是不同的符號(例如';'),而不是 ''

然後測試應該是

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

最終版本,這對我的作品:

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."); 
     } 
    } 

} 

測試:

@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

「更正」不需要。 在我看來,最好是在單引號字符串內用Kapep回答表示「數組」 –

3

@CsvSource使用implicit conversion到CSV值轉換到原語,枚舉或日期。對於其他類型的陣列,您需要explicit conversion

假設你有像@CsvSource("abc, 123, 'foo, bar'")格式的CSV註解,你可以實現一個參數轉換器這樣對待一個CSV列數組:

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."); 
     } 
    } 

} 

然後你就可以使用轉換器在第三參數:

@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

非常感謝! –