【发布时间】:2019-04-22 02:03:08
【问题描述】:
我的项目中有几个枚举类。为了保证持久性,我们不依赖内部 id,因为它会随着枚举值的顺序而变化(例如,当稍后在两者之间添加新枚举时)。而是为每个值分配一个(通常是数字)id 属性。
但这会带来另一种错误可能性:同一个 id 可能会被分配两次。因此,我创建了一个 JUnit 测试来检查所有重复值的 ID。而且我想让该测试通用,以避免为每个新的枚举类复制粘贴。采用枚举类和用于持久性的 getter 并运行测试的东西,例如:
(new JUnitEnumTester(OneEnum.class, getId)).runTest()
(new JUnitEnumTester(TwoEnum.class, getName)).runTest()
到目前为止,我要做的是对单个枚举类的测试:
package com.xyz.enums;
import static org.junit.Assert.*;
import org.junit.Test;
import java.util.HashMap;
import java.util.Map;
public class OneTest {
@Test
// Testing enum IDs
public void testUniqueId_WithMap() {
Map<Integer,String> idMap = new HashMap<Integer,String>();
String msg = "";
for (One elem : One.values()) {
Integer enumId = new Integer(elem.getId());
if (idMap.containsKey(enumId)) {
msg += "\nDuplicate ID found: '" + enumId.toString() +
"' for enum: " + idMap.get(enumId) + ", " + elem.name();
}
else {
idMap.put(enumId, elem.name());
}
}
if (msg.length() > 0) {
fail(msg);
}
}
}
问题是,如何推广这种方法?
首先我打算使用静态方法,但不知道如何引用该方法以用作 getter。
public class JUnitTester {
static public void runTest(Class cls, ? method) {
:
}
}
我认为这无论如何都行不通,所以我现在正在研究泛型。虽然它似乎更面向对象,但仍然没有滚动。
public class JunitEnumTester <? extends Enum> {
public void runTest() {
Map<Integer,String> idMap = new HashMap<Integer,String>();
String msg = "";
for (Enum elem : Enum.values()) {
Integer enumId = new Integer(elem.getId());
if (idMap.containsKey(enumId)) {
msg += "\nDuplicate ID: '" + enumId.toString() +
"' for " + idMap.get(enumId) + ", " + elem.name();
}
else {
idMap.put(enumId, elem.name());
}
}
if (msg.length() > 0) {
fail(msg);
}
}
}
任何提示或方向去哪里?
【问题讨论】:
-
枚举是否都共享一个公共基类(即是否有一些继承发生)?
-
@umop-apisdn 目前没有。如果它可以减轻任务,可以添加它。
-
@Walter 我的答案在不更改枚举的情况下有效。
-
@LuCio 正确,我真的学到了很多东西。不过如果有的话,有兴趣看看其他方法。
-
只是一个提示:如果你得到一个你学到很多东西但不想show if it is helpful的答案,我想知道其他人是否会被激励回答。