testable-mock
testable-mock copied to clipboard
关于mock的使用问题
先说场景: 1.正常使用teatable-mock,分层写完每层的mock测试类,均可正常执行; 2.编写一个不使用mock的测试类场景,期中由于会调用到不同的bean,当调用到某一个bean时,这个bean在1的场景下,已经进行过mock返回了mock的值; 问题: 我新编写的2场景并未使用mock,而且也不想调用到1场景的mock的结果,我也不想删除原有的mock测试类,如何实现我2的场景能使用原有的bean去执行代码?
跨类做分层测试的情况,如果使用Testable,需要将Mock目标类作为Mock首个参数,同时配合TestableTool.MOCK_CONTEXT
变量传递额外来源信息实现。
例如要Mock的是TargetClass
的String 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方法中区分调用来源
这里需要指出,Testable设计的时候主要考虑纯单元测试场景,对单元测试/集成测试混用的情况会有一些额外使用成本(在Mock方法里判断MOCK_CONTEXT
中的上下文信息)