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

关于mock的使用问题

Open qijy opened this issue 2 years ago • 2 comments

先说场景: 1.正常使用teatable-mock,分层写完每层的mock测试类,均可正常执行; 2.编写一个不使用mock的测试类场景,期中由于会调用到不同的bean,当调用到某一个bean时,这个bean在1的场景下,已经进行过mock返回了mock的值; 问题: 我新编写的2场景并未使用mock,而且也不想调用到1场景的mock的结果,我也不想删除原有的mock测试类,如何实现我2的场景能使用原有的bean去执行代码?

qijy avatar Mar 06 '22 07:03 qijy

跨类做分层测试的情况,如果使用Testable,需要将Mock目标类作为Mock首个参数,同时配合TestableTool.MOCK_CONTEXT变量传递额外来源信息实现。

例如要Mock的是TargetClassString methodToMock(int i, int j)方法:

// Mock目标类不写到MockInvoke注解参数,而是加到方法的首参
@MockInvoke
private String methodToMock(TargetClass self, int i, int j) {
switch((String)MOCK_CONTEXT.get("TEST_LAYER")) {
        case "moduel-test":
            // 调用原方法
            return self.methodToMock(i, j);
        default:
            // 返回Mock值
            return "mock value";
    }
}

然后在测试开始时标注测试的类型(也可以统一放到测试类的Setup()方法里):

@Test
public void testService() {
    MOCK_CONTEXT.set("TEST_LAYER", "moduel-test");
    ... ...
}

文档见: https://alibaba.github.io/testable-mock/#/zh-cn/doc/use-mock?id=_2-在mock方法中区分调用来源

linfan avatar Mar 08 '22 07:03 linfan

这里需要指出,Testable设计的时候主要考虑纯单元测试场景,对单元测试/集成测试混用的情况会有一些额外使用成本(在Mock方法里判断MOCK_CONTEXT中的上下文信息)

linfan avatar Mar 08 '22 07:03 linfan