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