关于Java:如何在Mockito中模拟enum.values()

How to mock enum.values() in mockito

首先,我正在学习Java和Mockito,进行了搜索,但尚未找到正确的答案。

伪代码是这样的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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);
   }
}

我的问题是在单元测试中,如何生成模拟的prodNames?
测试仅需要2或3种产品,
在我的单元测试中,我尝试了这个

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

但是它说无法解析方法'thenReturn(java.util.List <... ProdEnum>)'

谢谢!


您无法在香草Mockito中模拟静力学。

如果您需要一点重构,那么:

1)将enum.values()调用移至包级方法:

1
2
3
4
5
6
7
8
9
..
List<String> prodNames = Array.stream(getProdNames())
            .map(prodEnum::getName)
            .collect(Collectors.toList());
..

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

2)监视您的SUT:

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

3)模拟getProdNames()方法:

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