在JMock中最常用的参数检查方式是equal,该方法需要用到被检查参数的equals函数
例如:
被测函数是Block类的enter函数,我们要使用mock的TetrisGraphic对象来测试它
public void enter(TetrisGraphic tg)
{
absPos = new TPosition(5,5);
tg.moveToPos(absPos);
}
JUnit测试用例如下:
@Test
public void testEnter() {
Block block = new Block(new TetrisShape(TetrisShape.LONG_BAR));
Mockery context = new Mockery();
final TetrisGraphic tg = context.mock(TetrisGraphic.class);
final TPosition expectedAbs = new TPosition(5, 5);
context.checking(new Expectations() {
{
oneOf(tg).moveToPos(with(equal(expectedAbs)));
}
});
block.enter(tg);
}
被检查的参数是TPosition对象,需要在TPosition类定义equals方法:
@Override
public boolean equals(Object object)
{
if (this == object)
return true;
if (object == null)
return false;
if (getClass() != object.getClass())
return false;
TPosition posComp = (TPosition)object;
return (posX == posComp.posX) && (posY == posComp.posY);
}
定义equals前建议加@Override,如果不加@Override, 似乎也没问题,但是如果在定义入参时出现错误的话,Java不会报错,后果是在使用with(equal(obj))时,这个自定义的equals不会被调用到。