mockito 为静态方法调用添加junit

iswrvxsc  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(149)

下面是我的类,其中Display类有一个静态方法resultDisplay()。Display类来自一个jar文件。我想为testCode()方法编写junit。我对Display.resultdisplay()调用不感兴趣。我只想验证junit中的列表内容。

public class Summation {

    private static final List<Integer> list = new ArrayList<>();
    
    public int testCode(int... a) {
        for(int aa : a)
            list.add(aa);
        return Display.resultDisplay(list);
    }
}
siv3szwd

siv3szwd1#

模拟静态访问和全局访问是一个棘手的问题。幸运的是,每个问题都可以通过另一层间接来解决:

interface DisplayWrapper {
  int resultDisplay(List<Integer> list);
}
class DisplayWrapperImpl implements DisplayWrapper {
  @Override int resultDisplay(final List<Integer> list) {
    return Display.resultDisplay(list);
  }
}
public class Summation {
    private static final List<Integer> list = new ArrayList<>();

    private final DisplayWrapper display;
    
    public Summation(final DisplayWrapper display) {
      this.display = display;
    }

    public int testCode(int... a) {
        Collections.addAll(list, a);
        return display.resultDisplay(list);
    }
}

现在,您的类可以轻松地进行测试。
生产代码:

new Summation(new DisplayWrapperImpl())

测试代码:

final DisplayWrapper display = mock(DisplayWrapper.class);
final Summation summation = new Summation(display);
// ...

相关问题