在Java中迭代过多的枚举类,测试`parse()`每个方法

时间:2017-09-20 14:41:27

标签: java unit-testing junit enums

我正在努力为我的Java Enum类编写一些Junit测试,并测试每个类的parse()方法。以下是FileFormatCodeEnum

一次执行此操作的示例
@Test
public void testFileFormatCodeEnum() {

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

由于我项目中的每个Enum类都有一个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);
        }
    }
}

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

任何人都知道有一种简单的方法吗?

3 个答案:

答案 0 :(得分:2)

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

parse

现在,您可以浏览所有枚举并测试他们的for (TestEnum t : allEnums) { for (Enum v : t.getValues()) { Assert.assertEquals(t.getParse().apply(v.toString()), v); } } 方法,如下所示:

{{1}}

Demo.

答案 1 :(得分:1)

您可以使用t.getEnumConstants()as per this other question

@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<Generic> clazz : allEnums) {
        for(Generic en : clazz.getEnumConstants()) {
            Assert.assertEquals(SpecificEnum.parse(en.getValue()), en);
        }
    }
}

当然,上面的代码假设枚举实现了Generic接口(或者您可能想要使用的任何接口),并且该接口具有.parse()方法。

答案 2 :(得分:0)

您要搜索的是:

https://docs.oracle.com/javase/tutorial/reflect/member/methodInvocation.html

看看Method类,特别是它的“invoke”方法,它允许你在编译时调用一个对象的方法而不知道它的类。