2016-12-04 78 views
0

使用JUnitJUnit:如何避免@Parameters中的詳細/重複數據? (重構)

一個測試類我有兩個實例變量:

private final Locale locale; 
private final PersonaValidationUpdate personaUpdateInvalid; 

它們的值通過@Parameters定義。有意向的@Test方法同時使用,當然它

我用:

@Parameters(name="{index}: Locale: ''{0}'' - ''{1}'' ") 
    public static Collection<Object[]> data() { 
     return Arrays.asList(new Object[][]{ 
      { ClientUserLocale.ENGLISH.getLocale(), PersonaValidationUpdate.NULL}, 
      { ClientUserLocale.ENGLISH.getLocale(), PersonaValidationUpdate.EMPTY}, 
      { ClientUserLocale.ENGLISH.getLocale(), PersonaValidationUpdate.MIN}, 
      { ClientUserLocale.ENGLISH.getLocale(), PersonaValidationUpdate.MAX}, 

      { ClientUserLocale.PORTUGUESE.getLocale(), PersonaValidationUpdate.NULL}, 
      { ClientUserLocale.PORTUGUESE.getLocale(), PersonaValidationUpdate.EMPTY}, 
      { ClientUserLocale.PORTUGUESE.getLocale(), PersonaValidationUpdate.MIN}, 
      { ClientUserLocale.PORTUGUESE.getLocale(), PersonaValidationUpdate.MAX}, 

      { ClientUserLocale.SPANISH.getLocale(), PersonaValidationUpdate.NULL}, 
      { ClientUserLocale.SPANISH.getLocale(), PersonaValidationUpdate.EMPTY}, 
      { ClientUserLocale.SPANISH.getLocale(), PersonaValidationUpdate.MIN}, 
      { ClientUserLocale.SPANISH.getLocale(), PersonaValidationUpdate.MAX} 
     }); 
    } 

即使在上述工程中的代碼,很冗長,想象一下,如果我們添加了一個新的Locale(即:日本)。我必須添加一個新塊並重復ClientUserLocale.JAPANESE.getLocale() 次。

有沒有辦法減少上面顯示的代碼?

我的目標是測試

PersonaValidationUpdate.NULL 
PersonaValidationUpdate.EMPTY 
PersonaValidationUpdate.MIN 
PersonaValidationUpdate.MAX 

凡從上面的每個項目,應該是所有可用的Locale s到我ClientUserLocale枚舉測試。在這種情況下,我只有3個定義。

+0

怎麼樣通過'ClientUserLocale'值列表循環和添加新項對於'NULL','EMPTY','MAX','MIN'中的每一個?這樣,無論您添加或刪除新的枚舉值,代碼都不會改變... – Morfic

+0

您好,PersonaValidationUpdate是其他枚舉根據每種情況或場景創建無效實體。將有可能看到一個代碼來獲得更好的理解? –

+0

如果'PersonaValidationUpdate'也是一個枚舉,那麼它可能更簡單。看看下面的答案,讓我知道你的想法/疑惑。 – Morfic

回答

1

免責聲明:代碼可能無法編譯,它只是寫的基礎上,OP的描述和代碼段


@Parameters(name = "{index}: Locale: ''{0}'' - ''{1}'' ") 
public static Collection<Object[]> data() { 
    List<Object[]> data = new ArrayList<>(); 

    for (ClientUserLocale locale : ClientUserLocale.values()) { 
     for (PersonaValidationUpdate validation : PersonaValidationUpdate.values()) 
      data.add(new Object[]{locale.getLocale(), validation}); 
    } 

    return data; 
}