【问题标题】:Match a string to an enum name将字符串与枚举名称匹配
【发布时间】:2016-02-09 10:37:59
【问题描述】:

是否有任何干净的方法来测试给定的字符串是否与枚举名称匹配?

现在我明白了

Expected: is <SUNDAY>
Actual: SUNDAY

我想避免在每张支票中添加.name()

assertThat("SUNDAY", is(SUNDAY.name()))

某事

assertThat("SUNDAY", isEnum(SUNDAY))

我不是在问如何编写自己的 Matcher,我是在问是否已经构建了一些东西,但我似乎找不到。

【问题讨论】:

  • Afaik,没有现有的匹配器。 AssertJ 有,afaik,也没有这样的匹配器。

标签: java testing matcher hamcrest


【解决方案1】:

选项 1

您可以使用Enum.valueOf(DAYS.class, "Sunday")。我刚刚将您的枚举命名为DAYS,因为我不知道它的名称。这就是Enum.valueOf 所做的:

返回指定枚举类型的枚举常量 指定的名称。名称必须与使用的标识符完全匹配 在这种类型中声明一个枚举常量。 (多余的空格 不允许使用字符。)

也就是说,如果存在这样的枚举值,你会得到一个枚举实例,否则你会得到一个异常。因此,您可以断言结果并检查您是否获得了值或抛出了异常。

选项 2

您可以按如下方式创建HashSet

HashSet<String> set = new HashSet<>();
for (final DAYS day : EnumSet.allOf(DAYS.class)) {
  set.add(day.name());
}

并且只检查是否设置了contains的具体日期:

assertTrue(set.contains("SUNDAY")); //Hope I'm using the assertion syntax right. Haven't used this framework before.

【讨论】:

  • Enum.valueOf 永远不会返回 null,而是抛出 IllegalArgumentException
  • 嗯,没错,但是assertThat(valueOf(Days.class, "SUNDAY"), is(SUNDAY))assertThat("SUNDAY", is(SUNDAY.name())) 干净吗?
  • 你不需要像你提到的那样添加 name 方法,你不需要写任何新的东西,我假设你事先不知道你会得到哪些值作为输入或哪些值存在于枚举中。在此解决方案中,您对此完全灵活。另外 - 检查我添加的第二个选项,也许它更符合您的需求。
  • 感谢您的帮助,但选项 2 也不起作用。我需要为每个要测试的枚举创建Set,并使其可用于所有测试类。另外,contain 命名在某种程度上具有误导性,并且与现有的containsxxx Matchers 相冲突。我认为 Floriant 的评论几乎可以回答我的问题。
  • 选项 2:1: 使用 assertTrue 而不是 assertThat,因为 assertTrue 使用简单的布尔运算符而不是对象和匹配器。 2:你可以更好地使用name()而不是toString(),因为toString通常用于证明枚举的人类可读名称
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多