===== jmock 用途 =====
假如在测试的时候遇到如下情况:
- 我要测试函数A,但是A依赖一个 complexObject 对象(很难new出来,因为构造函数中依赖很多东西)
- 但是A函数中只用到了complexObject中的一个简单函数,那真么办?
对于这种想用某个对象一个部分功能,又不想构建完整对象的情况下,就可以用jmock模拟一个对象,模拟对象只需要模拟需要的那部分功能即可
===== 代码 =====
maven
junit
junit
4.11
org.jmock
jmock-junit4
2.5.1
org.objenesis
objenesis
2.2
cglib
cglib-nodep
2.2.2
org.jmock
jmock-legacy
2.5.1
代码
import junit.framework.Assert;
import org.jmock.Expectations;
import org.jmock.Mockery;
import org.jmock.integration.junit4.JUnit4Mockery;
import org.junit.Test;
import org.jmock.lib.legacy.ClassImposteriser;
public class A {
@Test
public void B() {
// 建立一个context上下文对象。(用于mock interfac)
Mockery context = new Mockery();
// 生成一个mock对象
final AddressService addressServcie = context.mock(AddressService.class);
// 设置期望。
context.checking(new Expectations() {
{
String s1 = "age";
// 设置期望: addressServcie 对象,调用getAge函数,参数是s1
allowing(addressServcie).getAge(s1);
// 设置返回值
will(returnValue("age:11"));
String s2 = "name";
oneOf(addressServcie).getName(s2);
will(returnValue("name:fang"));
}
});
// 验证结果
Assert.assertEquals("age:11name:fang", testMockInterface(addressServcie));
//------------------------------------------------------------------------------------
// 建立一个context上下文对象。(用于mock class)
final Mockery context1 = new JUnit4Mockery() {{
setImposteriser(ClassImposteriser.INSTANCE);
}};
// 生成一个mock对象
final Address address = context1.mock(Address.class);
// 设置期望。
context1.checking(new Expectations() {
{
allowing(address).test();
will(returnValue("test"));
}
});
// 验证结果
Assert.assertEquals("test", testMockClass(address));
}
// 因为传递了一个模拟对象进来,终于让这个函数可以顺利进行测试了
public String testMockInterface(AddressService addressService) {
return addressService.getAge("age")+ addressService.getName("name");
}
public String testMockClass(Address address) {
return address.test();
}
}
interface AddressService{
String getAge(String age);//{
String getName(String name);//{
}
class Address{
public Address(String a){
System.out.println("init");
}
public String test(){
return "1";
}
}
===== jmock用法 =====
==== jmock 期望框架 ====
invocation-count (mock-object).method(argument-constraints);
inSequence(sequence-name);
when(state-machine.is(state-name));
will(action);
then(state-machine.is(new-state-name));
* invocation-count 调用的次数约束
* mock-object mock对象
* method 方法
* argument-constraints 参数约束
* inSequence 顺序
* when 当mockery的状态为指定的时候触发。
* will(action) 方法触发的动作
* then 方法触发后设置mockery的状态
==== 可以指定方法调用的次数 ====
- exactly 精确多少次
- oneOf 精确1次
- atLeast 至少多少次
- between 一个范围
- atMost 至多多少次
- allowing 任意次
- ignoring 忽略
- never 从不执行