我正在努力为我的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);
}
}
}
我不太确定如何使用反射(?)来实现这一点。
任何人都知道有一种简单的方法吗?
答案 0 :(得分:2)
创建一个类来存储“测试对” - 所有枚举的列表,以及解析其文本值的函数:
parse
现在,您可以浏览所有枚举并测试他们的for (TestEnum t : allEnums) {
for (Enum v : t.getValues()) {
Assert.assertEquals(t.getParse().apply(v.toString()), v);
}
}
方法,如下所示:
{{1}}
答案 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”方法,它允许你在编译时调用一个对象的方法而不知道它的类。