The untestable enum switch in Java

If you are a Java developer you have at some point written a switch statement based on Enums. This is perfectly normal and in some cases the “only” way how to solve your problem. I wouldn’t have looked for alternatives maybe if there was a nice clean way to Unit test this without using additional test-suite libraries (like PowerMock).

Let’s assume we have the following code:

public enum Action {

And in some other class we have a switch statement like the following:

public class ActionDelegator {   public void delegate(Action a, Data d) {

switch(a) {
case EAT:
case SLEEP:
case DRINK:
case CODE:
throw new RuntimeException("Action unknown");

In order to keep this post short we assume that these methods are implemented according to our needs and the Data object can be anything on which we want to perform the actions.

When we write such code and we want to unit test it we can do it without providing ‘default’ case, but the compiler and some code styling tools will complain about this and in general the more correct way is to introduce a default block, to be safe from all aspects. Doing so I came across the issue that I cannot test the default case with normal JUnit testing suites.

What I would like to show in this article is an alternative that not only avoids using a switch, but it can also be Unit Tested.

The alternative that I will present is taking advantage of Java data structures and functional interfaces. The way the switch statement was rewritten is the following:

public class ActionDelegator{   private final Map<Action, Consumer<Data>> delegators = Map.of(
EAT, this::eat,
SLEEP, this::sleep,
DRINK, this::drink,
CODE, this::code
public void delegate(Action a, Data d) {
.ifPresent(consumer -> consumer.accept(d));

This way we explicitly limit which choices do we cover, we protect ourselves from null inputs and we have testable code.

This can of course be extended and improved if we want to explicitly handle unknown cases, but in this scenario this was not required.

I hope you find this useful and until next time.




Love podcasts or audiobooks? Learn on the go with our new app.

Recommended from Medium

Chaos Community Day

Few thoughts on cloud migration readiness assessment- part 1

Sum of all odd length subarray’s

Through its inverse, bypassing unworthy things saves you time and money, and also significant…

Agariopedia: a multiplayer online game encyclopedia

How big MNC’s like Google, Facebook, Instagram, etc.

CSS Variables: Why They Matter

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Adji Andov

Adji Andov

More from Medium

Debugging Collections, Streams and Watch Renderers


String in Java is immutable

ArrayList in Java