0

我的任务是创建一个针对我们的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)。我将如何以编程方式执行此操作?

4

6 回答 6

2

遍历所有常量的字符串值,如果它们不在集合中,则将它们粘贴在集合中。如果它们已经在集合中,则测试失败。

或者,您可以将重复项粘贴到不同的集合中,并在该组重复项为空时进行测试 - 这将在您每次运行测试时为您提供重复项列表(而不是必须重新运行测试,直到您已删除所有重复项)。

于 2012-04-18T17:38:59.073 回答
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));
    } 
  }
}
于 2012-04-18T17:40:25.777 回答
1

您可以只发现字段,然后检查唯一性(例如,将它们放在树形图中,然后计数)。

public void test() throws Exception {
    for (Field f : ConstantsClass.class.getDeclaredFields()) {
        System.out.println(f.getName() + ": " + f.get(null));
    }
}

取自通过反射访问 Java 静态最终 ivar 值

于 2012-04-18T17:41:59.960 回答
1

使用java.lang.Class.getFields(),遍历数组,获取每个值(使用Field.get(null)),检查它是否已经在 Set 中,如果不存在则将其存储在 Set 中。

于 2012-04-18T17:43:19.833 回答
0

如果你改用枚举,你的生活会容易得多。然后,您可以选择使成员名称与所需值匹配

enum Status {
RE,CA,RE;
}

在这种情况下,编译器保证它们是唯一的,或者将值存储为属性

enum Status {
  averbosenamedescribingwhatremeans("RE") 
  etc, etc

  private final String statusCode;

  Status(String code) {
  this.statusCode = code;
  }  
}

您可以使用枚举提供的 values() 方法轻松检查单元测试中代码的唯一性。

另外,您将拥有类型安全的代码。

使用您当前的方法,您需要通过反射查询类。

于 2012-04-18T17:41:32.897 回答
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());
    }
}
于 2012-04-18T17:47:50.733 回答