alibaba / testable-mock

换种思路写Mock,让单元测试更简单
https://alibaba.github.io/testable-mock/
MIT License
1.83k stars 310 forks source link

mock被测试类父类中的成员变量(protected)的方法无法生效 #192

Closed lingyunlujixin closed 3 years ago

lingyunlujixin commented 3 years ago

版本:0.6.2 问题:mock被测试类的父类中的成员变量(protected)的方法无法生效 例子:

// 被测试类 public class TestedClassA extends TestedClassB {

private TestedClassC cInClassA;

// 被测试方法1 public void methodOfMain() { mothedOfB(); }

// 被测试方法2 public void methodOfSecond() { cInClassA.methodOfC(); } }

public class TestedClassB {

protected TestedClassC c;

protected void mothedOfB() {
    c.methodOfC();
}

}

public class TestedClassC {

public void methodOfC() {
    System.out.println("methodOfC");
}

}

// 测试类 public class TestedClassATest {

public static class Mock {

    @MockMethod(targetClass = TestedClassC.class)
    public void methodOfC() {
        System.out.println("mock methodOfC");
    }

}

@Test // 上述Mock不能正常工作
public void test1() {

    TestedClassA a = new TestedClassA();

    a.methodOfMain();
}

@Test // 上述Mock可正常工作
public void test2() {

    TestedClassA a = new TestedClassA();

    a.methodOfSecond();
}

}

linfan commented 3 years ago

如果需要Mock在TestedClassB内发生的调用,需要在TestedClassBMockTestedClassBTest.Mock类中定义相应的替代Mock方法。

TestableMock的设计假设”所有单元测试都是针对目标业务类内部方法逻辑的功能验证“,因此Mock只会对关联的业务类内部的调用生效,不会对业务类以外的代码(包括其父类的代码)起作用。对于不符合这种情况测试场景,TestableMock依然可以兼容,但会使得Mock方法的定义需要相应分散到多个Mock容器类里。

lingyunlujixin commented 3 years ago

如果需要Mock在TestedClassB内发生的调用,需要在TestedClassBMockTestedClassBTest.Mock类中定义相应的替代Mock方法。

TestableMock的设计假设”所有单元测试都是针对目标业务类内部方法逻辑的功能验证“,因此Mock只会对关联的业务类内部的调用生效,不会对业务类以外的代码(包括其父类的代码)起作用。对于不符合这种情况测试场景,TestableMock依然可以兼容,但会使得Mock方法的定义需要相应分散到多个Mock容器类里。

thankx