验证枚举值只出现一次

时间:2017-05-15 16:08:21

标签: java arraylist junit enums

我有一个enum和一个对象,我想在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,它包含具有两个属性的Color对象:value和description。我想验证ColorList以测试有四个Color对象包含枚举中的值。如果有的话,我希望我的测试失败:

  1. Enum中不存在于arrayList
  2. 中的值
  3. arrayList中不存在于Enum
  4. 中的值

2 个答案:

答案 0 :(得分:1)

请检查以下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));
        }

    }

}

答案 1 :(得分: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中使用枚举值并且使枚举类名称为单数(而不是复数)-eg你可以称之为public enum NamedColor { YELLOW, RED; }。您也可以将value重命名为description,以使其目的更加明确。