本文假设读者已了解mock的基本定义,基础使用场景。本文的mock框架采用jmock
1、mock经典测试场景
class ToTest {
private Member m;
public void test(Varible v){
m.call();
v.call();
}
}
通过mock出一个m和v,并对其行为进行预测,就可以对ToTest.test()进行单元测试
2、本文关注的问题为以下使用场景
Class ToTestA{
public int test(){
SomeClass s = new SomeClass();
s.call();
}
}
这样的情况下,如何才能对ToTestA.test()进行有效的单元测试。
笔者碰到的情况不是这么简单,因为还涉及到将类名存储到数据库,然后进行反射拿到类的实例,但是问题和上述基本一致。
3、解决办法
构造一个factory,使用factory method构造对象。
Class Factory{
public SomeClass build(){
return new SomeClass();
}
}
新的ToTestA实现
Class ToTestA{
Factory f = new Factory();
public int test(){
SomeClass s = f.build();
s.call();
}
}
那么被测试的模型就成功转换为Class ToTest,能够满足mock的要求
4、评价
缺陷:需要先对源代码进行改造后才能继续重构,并且产生新的类
优势:在对主逻辑进行重构前可以写出能跑的测试用例
本文讨论了在存在类实例依赖外部环境时,如何使用Factory方法将类实例的创建过程从测试主体中分离出来,从而使得mock框架能够更好地应用于单元测试。通过构造一个Factory类来生成所需实例,使得原本复杂的测试场景得以简化,实现了对类方法的有效单元测试。
3302

被折叠的 条评论
为什么被折叠?



