JMockit对super方法的mock实践

2020-08-30  本文已影响0人  普通的程序员

这篇实践,是为了验证一个问题
1.mock能不能 不执行父类方法?
2.构造器经过mock后,父类构造器会不会执行?

BaseClass.class

public class BaseClass {
    public BaseClass(String s) {
        System.out.println("this base class call:" + s);
    }

    public void baseFunc() {
        System.out.println("this baseclass do baseFunc");
    }
}

ParentClass.class

public class ParentClass extends BaseClass{
    public ParentClass(String s) {
        super(s);
        System.out.println("this ParentClass class call:" + s);
    }

    @Override
    public void baseFunc() {
        super.baseFunc();
        System.out.println("this parentclass do call");
    }
}

ChildClass.class

public class ChildClass extends ParentClass {

    public ChildClass(String s) {
        super(s);
        System.out.println("this ChildClass class call:" + s);
    }

    @Override
    public void baseFunc() {
        super.baseFunc();
        System.out.println("this childclass do call");
    }
}

ChildClassJMockitTest.class

public class ChildClassJMockitTest {
    static final class ChildClassMockUp extends MockUp<ChildClass> {
        @Mock
        public void $init(String s) {

        }
        @Mock
        public void $clinit(){

        }
    }

private ChildClassMockUp childClassMockUp = new ChildClassMockUp();//这一行有妙用

    @Test
    public void testFunc() {
        ChildClass child = new ChildClass("lahm");
        child.baseFunc();
    }
}

运行结果
屏蔽标记行的运行结果是


image.png

不屏蔽标记行的运行结果


image.png

区别就是,当前类childClass的构造器方法不被执行了。
但是父类构造器,跟父类方法实现 依旧执行。

原理:super的字节码并未被改变

上一篇下一篇

猜你喜欢

热点阅读