2017-05-15 71 views
0

我有一個枚舉和對象,我想在junit測試中驗證uniqeness。驗證枚舉值出現一次,只有一次

例如,我有一個枚舉顏色,如下圖所示:

public enum Colors{ 

    Yellow("This is my favorite color"), 
    Blue("This color is okay"), 
    Orange("I do not like this color"), 
    Green("I hate this color"); 

    private String value; 

    Colors(String value) { 
     this.value = value; 
    } 

    public String getDescription() { 
     return value; 
    } 
} 

我也有一個名爲ColorList一個ArrayList,它包含色彩具有兩個屬性的對象:值和說明。我想驗證ColorList以測試在枚舉中包含四個Color對象的值。我想我的測試失敗如果任:

  1. ,是不是,是不是內枚舉
+1

你必須使用'List'嗎?您可以使用['EnumSet '](https://docs.oracle.com/javase/7/docs/api/java/util/EnumSet.html)。這可以保證集合中只有一個枚舉值。如果你需要包含所有值,你可以通過['EnumSet.allOf(Colors.class)'](https://docs.oracle.com/javase/7/docs/api/java/util/EnumSet html的#allOf(java.lang.Class中))。 –

+0

我相信使用枚舉集要求將顏色從java.lang.Enum進行擴展,但在這種情況下,我無法修改顏色 – DevelopingDeveloper

+1

@DevelopingDeveloper根據[Java™教程 - 枚舉類型](https://docs.oracle。 com/javase/tutorial/java/javaOO/enum.html):*所有枚舉隱式擴展java.lang.Enum *。* Java語言規範[§8.9。枚舉類型](https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.9)說:*枚舉類型E的直接超類是'Enum ' * – Andreas

回答

1

我認爲你可以用EnumSet做你最想做的事。這將確保您只有一次所有的顏色,除此之外沒有別的。

EnumSet<Colors> allColors = EnumSet.allOf(Colors.class); 

這裏是我玩耍的情況下,它可以幫助:

import static org.hamcrest.Matchers.*; 
import static org.junit.Assert.*; 

import java.util.EnumSet; 

import org.junit.Test; 

public class TempTest { 

    @Test 
    public void x() { 
     EnumSet<Colors> allColors = EnumSet.allOf(Colors.class); 
     assertEquals(4, allColors.size()); 
     assertThat(allColors, contains(Colors.Yellow, Colors.Blue, Colors.Orange, Colors.Green)); 
     for (Colors c : allColors) { 
      System.out.println(c.name() + " (" + c.getDescription() + ")"); 
     } 
    } 
} 

它得到一個綠色的酒吧和打印:

Yellow (This is my favorite color) 
Blue (This color is okay) 
Orange (I do not like this color) 
Green (I hate this color) 

順便說一句,我只好在Eclipse編譯錯誤:您的枚舉值列表以逗號代替分號結束。

此外,在幾個樣式點上,我不知道是否可以更改枚舉,但是,如果可以,Java中的常規約定是枚舉值爲ALL_CAPS並使枚舉類名單數(而不是複數)—例如你可以稱它爲public enum NamedColor { YELLOW, RED; }。您也可以將value重命名爲description以使其目的更清晰。

1

在ArrayList中存在

  • 值在ArrayList中枚舉中存在的值,請請檢查以下junit測試用例,這些測試用例在您指定的情況下會失敗

    import java.util.ArrayList; 
    import java.util.List; 
    
    import junit.framework.Assert; 
    
    import org.junit.Before; 
    import org.junit.Test; 
    
    enum Colors { 
    
        Yellow("This is my favorite color"), Blue("This color is okay"), Orange(
          "I do not like this color"), Green("I hate this color"); 
    
        String value; 
    
        Colors(String value) { 
         this.value = value; 
        } 
    
        public String getDescription() { 
         return value; 
        } 
    } 
    
    public class JunitSample { 
    
        private List<Colors> smallList; 
        private List<String> largeList; 
    
        @Before 
        public void setUp() { 
         smallList = new ArrayList<Colors>(); 
         largeList = new ArrayList<String>(); 
    
         // Not keeping yellow in smallList. 
         smallList.add(Colors.Blue); 
         smallList.add(Colors.Green); 
         smallList.add(Colors.Orange); 
    
         largeList.add("Blue"); 
         largeList.add("Green"); 
         largeList.add("Orange"); 
         largeList.add("Yellow"); 
         largeList.add("Red"); // Red is not defined in Colors Enum class 
    
        } 
    
        @Test 
        public void testColorsWhichAreNotThereInEnum() { 
    
         for(String value : largeList){ 
          Assert.assertNotNull("value not available", Colors.valueOf(value)); 
         } 
    
        } 
        @Test 
        public void testColorsWhichAreNotThereInSmallList() { 
    
         for(Colors color : Colors.values()){ 
          Assert.assertEquals("Color not availale in list",true, smallList.contains(color)); 
         } 
    
        } 
    
    }