user3552178
user3552178

Reputation: 2971

How to mock enum.values() in mockito

First of all i'm learning java and mockito, did search and cannot find proper answer yet.

The pseudo code is like this

public enum ProdEnum {
    PROD1(1, "prod1"),
    PROD2(2, "prod2"),
    ......
    PROD99(2, "prod2");

    private final int id;
    private final String name;

    private ProdEnum(int id, String name) {
        this.id = id;
        this.name = name;
    }

    prublic String getName() { return this.name; }
}


public class enum1 {
   public static void main(String[] args) {
      // Prints "Hello, World" in the terminal window.
      System.out.println("Hello, World");

      List<String> prodNames = Array.stream(ProdEnum.values())
            .map(prodEnum::getName)
            .collect(Collectors.toList());

      // verify(prodNames);
   }
}

My question is in unit test, how to generate mocked prodNames ? Only 2 or 3 of the products needed for testing, In my unit test i tried this

List<ProdEnum> newProds = Arrays.asList(ProdEnum.PROD1, ProdEnum.PROD2);
when(ProdEnum.values()).thenReturn(newProds);

but it says Cannot resolve method 'thenReturn(java.util.List<...ProdEnum>)'

Thanks !

Upvotes: 0

Views: 13402

Answers (1)

Maciej Kowalski
Maciej Kowalski

Reputation: 26502

You cannot mock statics in vanilla Mockito.

If your up for a little refactor then:

1) Move enum.values() call into a package level method:

..
List<String> prodNames = Array.stream(getProdNames())
            .map(prodEnum::getName)
            .collect(Collectors.toList());
..

List<String> getProdNames(){
  return ProdEnum.values();
}

2) Spy on your SUT:

enum1 enumOneSpy = Mockito.spy(new enum1());

3) Mock the getProdNames() method:

doReturn(newProds).when(enumOneSpy).getProdNames();

Upvotes: 2

Related Questions