我正在寻找一种在子类ButtonClicker中模拟超级调用的解决方案。

Class Click {
      public void buttonClick() throws java.lang.Exception { /* compiled code */ }     }

Class ButtonClicker extends Click {
    @Override
    public void buttonClick() throws Exception {

        super.buttonClick();
    } }

最佳答案

使用继承会降低代码的可测试性。考虑用delegation替换继承并模拟委托。

提取界面IClicker

interface IClicker {
    void buttonClick();
}


IClicker类中实现Clicker。如果您正在使用第三方代码,请考虑使用Adapter Pattern

重写您的ButtonClicker,如下所示:

class ButtonClicker implements IClicker {
    Clicker delegate;

    ButtonClicker(Clicker delegate) {
        this.delegate = delegate;
    }

    @Override
    public void buttonClick() throws Exception {
        delegate.buttonClick();
    }

}


现在只需将模拟作为构造函数参数传递:

Clicker mock = Mockito.mock(Clicker.class);
// stubbing here
ButtonClicker buttonClicker = new ButtonClicker(mock);

07-24 01:54