4

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

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

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

        super.buttonClick();
    } }
4

2 回答 2

6

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

提取接口 IClicker

interface IClicker {
    void buttonClick();
}

IClickerClicker课堂上实施。如果您正在使用第三方代码,请考虑使用适配器模式

重写你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);
于 2011-12-14T15:31:02.020 回答
3

答案是不。模拟只是一个微不足道的接口实现。(我指的是 API 意义上的接口,而不是特定的 Java 关键字意义上的接口。)所以它不知道任何实现细节,比如哪个类实际实现了功能(本质上没有功能)。

您可以在真实对象上创建一个“间谍”,它只允许您模拟某些方法而不模拟其他方法,但这也不会让您只模拟一个类的超级方法,因为您选择模拟的方法通常是由签名选择,对于子类和超类都是一样的。

于 2011-12-14T17:27:25.220 回答