我的任务是创建一个针对我们的Constants
类运行的测试,以确保类中的每个值都是唯一的。我不是在谈论常量名称(IDE会告诉开发人员是否重复这些名称),而是将常量设置为值。
我是Java新手,不确定如何做到这一点。
为清楚起见,我的Constants
类定义如下:
public static final String STATUS_RECEIVED = "RE";
public static final String STATUS_CANCELLED = "CA";
public static final String STATUS_REVIEWED = "RE";
在上面的例子中,我希望我的测试注意到有一个重复的值(因为STATUS_RECEIVED == STATUS_REVIEWED)。我该如何以编程方式执行此操作?
答案 0 :(得分:2)
迭代所有常量的字符串值,如果它们不在集合中,则将它们粘贴在集合中。如果它们已经在集合中,则测试失败。
或者你可以将副本粘贴到一个不同的集合中,并对那组重复项进行测试是空的 - 每次运行测试时都会给你一个重复列表(而不是重新运行测试直到你删除所有重复项。)
答案 1 :(得分:2)
Field[] fields = Constants.class.getDeclaredFields();
List<Field> staticFields = new ArrayList<>();
for(Field f:fields) {
if (Modifier.isStatic(f)) {
staticFields.add(f);
}
}
for (int i = 0; i < staticFields.size(); i++) {
for (int j = i + 1; j < staticFields.size(); j++) {
if (staticFields.get(i).get(null).equals(staticFields.get(j).get(null))) {
throw new AssertionFailedError(staticFields.get(i) + " equals "
+ staticFields.get(j));
}
}
}
答案 2 :(得分:1)
您可以发现字段,然后检查唯一性(例如将它们放在树形图中,然后计数)。
public void test() throws Exception {
for (Field f : ConstantsClass.class.getDeclaredFields()) {
System.out.println(f.getName() + ": " + f.get(null));
}
}
答案 3 :(得分:1)
使用java.lang.Class.getFields()
,遍历数组,获取每个值(使用Field.get(null)
),检查它是否已经存在于Set中,并将其存储在Set中(如果它已经存在)。
答案 4 :(得分:0)
如果你使用枚举,你的生活将会轻松许多。然后,您可以选择使成员名称与所需值匹配
enum Status {
RE,CA,RE;
}
在这种情况下,编译器保证它们是唯一的,或将值存储为属性
enum Status {
averbosenamedescribingwhatremeans("RE")
etc, etc
private final String statusCode;
Status(String code) {
this.statusCode = code;
}
}
您可以使用枚举提供的values()方法轻松检查单元测试中代码的唯一性。
另外,你会有类型安全的代码。
使用您当前的方法,您需要通过反射查询该类。
答案 5 :(得分:0)
考虑将Constants
与Enum
保持当前String
值。类似的东西:
public enum Constants {
STATUS_RECEIVED("RE"),
STATUS_CANCELLED("CA"),
STATUS_REVIEWED("RE")
private String value;
public Constants(String value) {
this.value = value;
}
public String getValue() {
return value;
}
}
然后,您的测试可能会迭代每个value
常量的Enum
字段,如果该值已经存在则会失败例如:
public void testConstantValueUniqueness() {
Set<String> values = new HashSet<String>();
for(Constants constant : Constants.values()) {
if(values.contains(constant.getValue())) {
// fail
}
values.add(constant.getValue());
}
}