1. 测试类如果继承org.jmock.MockObjectTestCase,mock出来的类只能模仿Interface,要模仿具体类需要使用org.jmock.cglib.MockObjectTestCase(需要引用cglib-nodep-2.x.jar);
2.静态方法不能模拟,有必要时需要重构代码,这也是TDD代码可测性的要求;
3.方法参数如果是数值类型(int等),with()方法不能用isA(int.class)做判断,要么用with(eq(value)),要么使用withAnyArguments()方法;
4.jMock2.x一个Mockery实例可以mock多个类,所以一个Testcase只要初始化一个Mockery实例;
5.jMock2.x中mock设定的期望调用顺序是:先设定的先调用这个和1.x中相反。如果setUp()中写某一方法的模拟,想在每个testcase中改变使用其他的模拟需要这么写
setUp()
{
Mockery cntext = new Mockery();
States sta =context.states("随便名字").startAs("初始化状态名");//1
context.checking(new Exceptations()
{
{
ignoring(obj).do();when(sta.is("初始化状态名"));//2
when(sta.isNot("test中状态"));//3
}
});
}
test()
{
sta.is("test中状态").active();//4
context.checking(new Exceptations(){});
}
代码解释:
语句1,在setUp()中先设定一个状态;
语句2,写期待时语法为当状态是“初始化”则调用ignoring()方法
语句3,当状态不是“test中状态”则调用ignoring()方法
语句4,在test()中改变状态,激活ignoring(),使得setUp()设置的模拟不生效。之后就可以写新的模拟了。