JMockit是google code的一个java单元测试的mock项。虚拟的对象就是mock对象,mock对象其实就是真实对象在调试期的替代品。
使用Mock的一些建议:真实对象具有不确定的行为(如股票行情不可预测)
真实对象很难被创建(比如web容器)
真实对象的某些行为很难被触发(比如网络错误)
真实对象另程序的运行时间大大增加
真实对象包含页面
基于行为验证的单元测试可以分为3部分:设置某些期待的调用,执行被测试代码,验证是否调用成功。测试类:在这个类中执行测试代码
CUT(Code Under Test):被测试的类
依赖类:CUT调用的类,也可是被mock的真实对象
使用JMockit生成Mock对象
JMockit可以mock任意的class、interface。可以将mock对象声明为域或方法的参数。默认情况下,mock对象的所以非private的方法(包括除了object的其他继承方法),对这些
方法的调用不会执行原有代码,而是会转交给JMockit处理。
JMockit三步骤record:录制期望。也可以理解说数据准备阶段。比如说是mock掉实例,模拟返回数据,调用次数。
replay:通过调用被测代码,执行测试。
verify:验证。验证执行测试的次数。
在record需要初始化一个Expectation对象,在这个对象内部设置被依赖类的哪些方法被执行。在replay,执行被测试的类,被测试类会调用它依赖的类。JMockit会拦截调用并重定向到
verify.verify执行的操作类似于record,代表操作就是初始化Verifications对象
引入依赖
org.jmockit
jmockit
1.30
test
Demo@Component
public class HelloWorld {
public String hello(){
String hello="hello world";
return hello;
}
}
@RunWith(JMockit.class)
public class HelloWorldTest {
@Mocked
private HelloWorld helloWorld;
@Test
public void testHello(){
new NonStrictExpectations(){//record 一个期望块,用来录制期待模拟行为
{
helloWorld.hello();
result = "hello word";
}
};
helloWorld.hello();//replay
new Verifications(){//verify 一个验证块,用来验证预期Mock行为被调用
{
helloWorld.hello();
times = 1;
}
};
}
}
JMockit注解与方法
注解注解描述@Tested用于标识一个被测对象的实例,只能是类而不能是接口,[email protected]��,将在JMockit之前初始化。
@Injectable@[email protected],只会mock掉指定实例。如果没有被赋初值,那么JMockit将会以相应规则赋初值
@Mockedmocked修饰的实例,将会把实例对应类的所以实例的所以行为都mock掉(无论构造方法还是private、public方法),被mock的方法的调用将不会执行原有的方法,而是会转交给JMockit处理
@Capturing标识一个被mock的类以及子类均被mock
方法方法描述Expectations一个期望块,用来录制期待模拟行为。result是Expectations的一个变量,用来分配给该字段的值将作为当前期望的结果。
NonStrictExceptions类似于Expectations,不同的是。Expectations块中声明的mock一定要被执行,如果没有执行,会被认为case不通过。NonStrictExceptions则是必须调用一次
StrictExceptions严格的期望,指定方法必须按照指定的顺序执行,与NonStrictExceptions用法相反
Verifications一个验证块,用来Mock行为是否被调用。通常与NonStrictExceptions配合使用.times用来验证调用的次数
Invocation工具类,可以获取调用信息
Delegate自己指定返回值,适合那种需要参数决定返回值的场景,只需要执行匿名子类就可以
MockUp模拟函数的实现
Deencapsulation反射工具类