Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Match a string to an enum name

Is there any clean way of testing that a given String matches an enum name?

Right now I get

Expected: is <SUNDAY>
Actual: SUNDAY

I want to avoid having to add .name() to each check

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

Something as

assertThat("SUNDAY", isEnum(SUNDAY))

I'm not asking how to write my own Matcher, I'm asking if there is already something built, which I can't seem to find.

like image 743
user384729 Avatar asked Sep 26 '22 10:09

user384729


1 Answers

Option 1

You can use Enum.valueOf(DAYS.class, "Sunday"). I just named your enum DAYS because I don't know its name. This is what Enum.valueOf does:

Returns the enum constant of the specified enum type with the specified name. The name must match exactly an identifier used to declare an enum constant in this type. (Extraneous whitespace characters are not permitted.)

In other words, in case there exists such enum value, you will get an enum instance, otherwise you will get an exception. So you can just assert the result and check whether you get a value or an exception gets thrown.

Option 2

You can create a HashSet as follows:

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

And just check whether the set contains the specific day:

assertTrue(set.contains("SUNDAY")); //Hope I'm using the assertion syntax right. Haven't used this framework before.
like image 94
Avi Avatar answered Oct 11 '22 13:10

Avi