将字符串与枚举名称匹配

5
有没有一种简单的方法来测试给定的字符串是否与枚举名称匹配?
目前我得到的是:
Expected: is <SUNDAY>
Actual: SUNDAY

我希望避免每次检查时都需要添加.name()
assertThat("SUNDAY", is(SUNDAY.name()))

作为某物

assertThat("SUNDAY", isEnum(SUNDAY))

我不是在问如何编写自己的Matcher,而是在询问是否已经有现成的东西可用,但我似乎找不到。


据我所知,目前不存在这样的匹配器。AssertJ 也没有这样的匹配器,据我所知。 - Florian Schaetz
1个回答

4

选项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());
}

只需检查集合中是否包含特定日期:

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

Enum.valueOf 永远不会返回 null,而是会抛出 IllegalArgumentException - Ferrybig
那是正确的,但是 assertThat(valueOf(Days.class, "SUNDAY"), is(SUNDAY))assertThat("SUNDAY", is(SUNDAY.name())) 更简洁吗? - user384729
你不需要添加所提到的名称方法,也不需要编写任何新内容。我假设您不提前知道将获得哪些值作为输入或枚举中存在哪些值。在此解决方案中,您完全可以灵活处理。此外,请检查我添加的第二个选项,可能更适合您的需求。 - Avi
我很感激你的帮助,但选项2也行不通。我需要为我想要测试的每个枚举创建一个Set并将其提供给所有测试类使用。此外,这个“contain”命名有些误导,并且与现有的containsxxx匹配器发生冲突。我认为Floriant的评论基本上就是我的问题的答案。 - user384729
选项2:1: 使用assertTrue而不是assertThat,因为assertTrue适用于简单布尔运算符,而不是对象和匹配器。 2: 你可以更好地使用name()而不是toString(),因为toString()通常用于为枚举证明可读的人类名称。 - Ferrybig
@Ferrybig - 感谢您的评论。已做出修正。 - Avi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接