迭代Java中枚举类的数组,测试每个类的`parse()`方法

迭代Java中枚举类的数组,测试每个类的`parse()`方法,java,unit-testing,junit,enums,Java,Unit Testing,Junit,Enums,我正在努力高效地为Java Enum类编写一些Junit测试,并测试每个类的parse()方法。下面是一个为FileFormatCodeEnum一次执行一个的示例: @Test public void testFileFormatCodeEnum() { FileFormatCodeEnum[] ens = FileFormatCodeEnum.values(); for(FileFormatCodeEnum en : ens) { Assert.assertE

我正在努力高效地为Java Enum类编写一些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);
        }
    }
}
for (TestEnum t : allEnums) {
    for (Enum v : t.getValues()) {
        Assert.assertEquals(t.getParse().apply(v.toString()), v);
    }
}
@测试
公共无效遗嘱(){
ArrayList allEnums=新的ArrayList();
add(FileFormatCodeEnum.class);
add(roletypecodenum.class);
//从这里开始一些伪代码
对于(班级:allEnums){
//TODO:将枚举的clazz.values()放入名为“ens”的数组中
适用于(通用en:ens){
//是否将泛型枚举强制转换为特定枚举类型?
//然后在特定枚举上执行parse方法
Assert.assertEquals(SpecificEnum.parse(en.getValue()),en);
}
}
}
我不太确定如何使用反射(?)来实现这一点


有人知道有没有简单的方法吗?

您要搜索的是:

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

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

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))
);

您可以使用
t.getEnumConstants()

@测试
公共无效遗嘱(){
ArrayList allEnums=新的ArrayList();
add(FileFormatCodeEnum.class);
add(roletypecodenum.class);
//从这里开始一些伪代码
对于(班级:allEnums){
for(通用en:clazz.getEnumConstants()){
Assert.assertEquals(SpecificEnum.parse(en.getValue()),en);
}
}
}

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

枚举只是基本枚举,即
公共枚举文件格式CodeEnum{…}
,很不幸,这种方法行不通。感谢您的回复!我现在正在努力实现它,一旦我把它落实到位并确认,我可能会接受。这是一个好主意。然而,一个可接受的答案必须向我指出一个可行的解决方案,而不是一个探索领域。不过我很感谢你的评论。你做了研究并提到了一个指导性链接。您可以引用重要部分,并解释如何利用反射从每个枚举类中查找和执行
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<Generic> clazz : allEnums) {
        for(Generic en : clazz.getEnumConstants()) {
            Assert.assertEquals(SpecificEnum.parse(en.getValue()), en);
        }
    }
}