testable-mock icon indicating copy to clipboard operation
testable-mock copied to clipboard

间接mock静态方法失效

Open Qwenjin opened this issue 3 years ago • 5 comments

版本:0.6.7

//// 类A
public class MethodA {

    public String handle () {
        return UtilB.getInfo("aaa");
    }
}

//// 类B
public class UtilB {

    public static String getInfo (String url) {
        return url + InnerUtilC.rawInfo();
    }
}

//// 类C
public class InnerUtilC {

    public static String rawInfo () {
        return "RAW";
    }
}


//// 测试方法
public class MethodATest {

    private MethodA methodA = new MethodA();

    @Test
    public void handle() {
        System.out.println(methodA.handle());;
    }
}

//// mock类,和MethodATest在同个包下
public class MethodAMock {

    @MockMethod(targetClass = InnerUtilC.class)
    public static String rawInfo () {
        return "mock raw";
    }
}

问题描述:类A调用类B的静态方法,类B的静态方法实际调用类C的方法,但mock类C的静态方法时,并没有生效

预期结果:打印-> aaa mock raw 实际结果:打印-> aaaRaw

Qwenjin avatar Jul 01 '21 06:07 Qwenjin

InnerUtilC.rawInfo()方法的调用发生在UtilB类型中,因此需要在相应的UtilBMock类里创建Mock方法,MethodAMock类型的Mock定义不会生效

linfan avatar Jul 01 '21 06:07 linfan

InnerUtilC.rawInfo()方法的调用发生在UtilB类型中,因此需要在相应的UtilBMock类里创建Mock方法,MethodAMock类型的Mock定义不会生效

了解。而且UtilBMock的package还得保证和原始类一致才行。

Qwenjin avatar Jul 01 '21 06:07 Qwenjin

这样的设计的用意是不是推荐用户:mock被测试类UtilB的成员方法,或者被测试类UtilB直接调用的方法。而不是去mock更加深层的方法。如果是的话,这里有什么原因吗?

xinadfga avatar Jul 07 '21 01:07 xinadfga

这个设计初衷是让每个类的开发者自己提供当前类内部的Mock调用,形成每个业务类对应一个单元测试类+一个单元Mock类的结构,这种Mock方式确实也是利弊各半,需要一定适应

linfan avatar Jul 07 '21 03:07 linfan

这个设计初衷是让每个类的开发者自己提供当前类内部的Mock调用,形成每个业务类对应一个单元测试类+一个单元Mock类的结构,这种Mock方式确实也是利弊各半,需要一定适应

明白,谢谢答复

xinadfga avatar Jul 07 '21 07:07 xinadfga