本文假设读者已了解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、评价
缺陷:需要先对源代码进行改造后才能继续重构,并且产生新的类
优势:在对主逻辑进行重构前可以写出能跑的测试用例