使用JMockit编写java单元测试
作者:网络转载 发布时间:[ 2014/1/6 14:28:42 ] 推荐标签:Mock 单元测试 java
(1).基于行为的Mock方式:
非常类似与EasyMock和PowerMock的工作原理,基本步骤为:
1.录制方法预期行为。
2.真实调用。
3.验证录制的行为被调用。
通过一个简单的例子来介绍JMockit的基本流程:
要Mock测试的方法如下:
public class MyObject {
public String hello(String name){
return "Hello " + name;
}
}
使用JMockit编写的单元测试如下:
@Mocked //用@Mocked标注的对象,不需要赋值,jmockit自动mock
MyObject obj;
@Test
public void testHello() {
new NonStrictExpectations() {//录制预期模拟行为
{
obj.hello("Zhangsan");
returns("Hello Zhangsan");
//也可以使用:result = "Hello Zhangsan";
}
};
assertEquals("Hello Zhangsan", obj.hello("Zhangsan"));//调用测试方法
new Verifications() {//验证预期Mock行为被调用
{
obj.hello("Hello Zhangsan");
times = 1;
}
};
}
JMockit也可以分类为非局部模拟与局部模拟,区分在于Expectations块是否有参数,有参数的是局部模拟,反之是非局部模拟。
而Expectations块一般由Expectations类和NonStrictExpectations类定义,类似于EasyMock和PowerMock中的Strict Mock和一般性Mock。
用Expectations类定义的,则mock对象在运行时只能按照 Expectations块中定义的顺序依次调用方法,不能多调用也不能少调用,所以可以省略掉Verifications块;
而用NonStrictExpectations类定义的,则没有这些限制,所以如果需要验证,则要添加Verifications块。
上述的例子使用了非局部模拟,下面我们使用局部模拟来改写上面的测试,代码如下:
@Test
public void testHello() {
final MyObject obj = new MyObject();
new NonStrictExpectations(obj) {//录制预期模拟行为
{
obj.hello("Zhangsan");
returns("Hello Zhangsan");
//也可以使用:result = "Hello Zhangsan";
}
};
assertEquals("Hello Zhangsan", obj.hello("Zhangsan"));//调用测试方法
new Verifications() {//验证预期Mock行为被调用
{
obj.hello("Hello Zhangsan");
times = 1;
}
};
}
模拟静态方法:
@Test
public void testMockStaticMethod() {
new NonStrictExpectations(ClassMocked.class) {
{
ClassMocked.getDouble(1);//也可以使用参数匹配:ClassMocked.getDouble(anyDouble);
result = 3;
}
};
assertEquals(3, ClassMocked.getDouble(1));
new Verifications() {
{
ClassMocked.getDouble(1);
times = 1;
}
};
}

sales@spasvo.com