java - 遍历 Java 中的枚举类数组,测试每个类的 `parse()` 方法

标签 java unit-testing junit enums

我正在尝试高效地为我的 Java 枚举类编写一些 Junit 测试,并测试 parse()每个的方法。这是一次为 FileFormatCodeEnum 执行一个操作的示例:

@Test
public void testFileFormatCodeEnum() {

    FileFormatCodeEnum[] ens = FileFormatCodeEnum.values();
    for(FileFormatCodeEnum en : ens) {
        Assert.assertEquals(FileFormatCodeEnum.parse(en.getValue()), en);
    }
}

因为我项目中的每个枚举类都有一个 parse()方法,我不希望通过替换找到的所有类名来为它们中的每一个编写相同的代码。

我想做更多像这样的事情:

@Test
public void testAllEnums() {
    ArrayList<Class> allEnums = new ArrayList<Class>();
    allEnums.add(FileFormatCodeEnum.class);
    allEnums.add(RoleTypeCodeEnum.class);

    //begin some pseudo-code here
    for (Class clazz : allEnums) {
        //TODO: get clazz.values() of the enum into an array named 'ens'
        for(Generic en : ens) {
            //cast the generic enum to a specific enum type maybe?
            //then execute the parse method on the specific enum
            Assert.assertEquals(SpecificEnum.parse(en.getValue()), en);
        }
    }
}

我不太确定如何使用反射(?)来实现这一点。

谁知道有没有简单的方法?

最佳答案

创建一个类来存储“测试对”——所有枚举的列表,以及一个解析它们的文本值的函数:

class TestEnum {
    private final List<Enum> values;
    private final Function<String,Enum> parse;
    public TestEnum(List<Enum> v, Function<String,Enum> p) {
        values = v;
        parse = p;
    }
    public List<Enum> getValues() { return values; }
    public Function<String,Enum> getParse() { return parse; }
}
List<TestEnum> allEnums = Arrays.asList(
    new TestEnum(Arrays.asList(FileFormatCodeEnum.values()), s -> FileFormatCodeEnum.parse(s))
,   new TestEnum(Arrays.asList(RoleTypeCodeEnum.values()), s -> RoleTypeCodeEnum.parse(s))
);

现在您可以遍历所有枚举并测试它们的 parse 方法,如下所示:

for (TestEnum t : allEnums) {
    for (Enum v : t.getValues()) {
        Assert.assertEquals(t.getParse().apply(v.toString()), v);
    }
}

Demo.

关于java - 遍历 Java 中的枚举类数组,测试每个类的 `parse()` 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46325088/

相关文章:

java - 是否可以使用 ReentrantReadWriteLock 在写入之前读取?

java - Java 中的 Mock/Stub super 构造函数调用用于单元测试

c# - 从 MVC 4 C# Controller 测试 JSON 结果

c# - 对象关于单元测试的状态

java - 使用 PowerMock 模拟包含 lambda 表达式的类

java - 使用 Apache Commons VFS 通过 FTP URI 导航到根目录

java - 如何开始手工编码Java

Java - 如果在组合框1中选择了一个值,那么应该在所有其他组合框中禁用它

unit-testing - 在单元测试中使用初始化程序?

maven - Junit- 如何将测试附加到现有流程