我目前正在尝试进行垄断游戏的模拟测试课程。
我们已经获得了一些关于如何设置其中一些内容的说明,但也许我们只是误解了JMock的工作原理。
我们有使用takeTurn()
的Player类。我们有Die
,Board
和Piece
这些都是支持嘲弄的接口。然后我们有Square
类,它没有值,但只是代表一个Square。也许我们应该把它变成一个界面,因为它什么都没有,但我不知道。
无论我们做什么,测试总是失败。我试图省略部分,以便我们只做一个期望,但没有运气。我们是否完全误解了JMock?
这是我们的Player类:
public class Player {
Die d;
Piece p;
Board b;
void takeTurn(Die d, Piece p, Board b) {
this.d = d;
this.p = p;
this.b = b;
int i = d.roll();
int v = d.roll();
Square newLoc = b.getSquare(p.getLocation(), i + v);
p.setLocation(newLoc);
}
}
这是我们的PlayerTest课程:
public class PlayerTest extends TestCase {
Mockery context = new Mockery();
public void testTakeTurn() {
final Board b = context.mock(Board.class);
final Piece p = context.mock(Piece.class);
final Die d = context.mock(Die.class);
Player pl = new Player();
context.checking(new Expectations() {{
exactly(2).of (d).roll();
}});
context.checking(new Expectations() {{
oneOf (p).getLocation();
}});
final int diceroll = 5;
context.checking(new Expectations() {{
oneOf (b).getSquare(p.getLocation(), diceroll);
}});
final Square newLoc = new Square();
context.checking(new Expectations() {{
oneOf (p).setLocation(newLoc);
}});
pl.takeTurn(d,p,b);
context.assertIsSatisfied();
}
}
答案 0 :(得分:1)
嘲笑背后的想法是你制作虚假物品,你可以在上面设定期望值。期望包括将调用哪些方法以及从这些方法返回哪些结果。
后一项任务是您在当前代码中遗漏的内容。您需要告诉JMock通过模拟对象上的方法调用返回哪些值。如果没有告诉JMock,它默认为null
,0
,false
等值。
例如,您声明您预计会有两个骰子,但您没有提供被模拟的Dice
对象应返回的返回值。所以JMock只会返回0
。稍后您假设这两个卷总和为5
,这是错误的。
您的代码应该更改为大致(未经测试):
public class PlayerTest extends TestCase {
Mockery context = new Mockery();
public void testTakeTurn() {
final Board b = context.mock(Board.class);
final Piece p = context.mock(Piece.class);
final Die d = context.mock(Die.class);
Player pl = new Player();
final int roll1 = 2;
final int roll2 = 3;
context.checking(new Expectations() {{
exactly(2).of (d).roll();
will(onConsecutiveCalls(
returnValue(roll1),
returnValue(roll2))
}});
final Location currentLocation = // set to your desired test loc...
context.checking(new Expectations() {{
oneOf (p).getLocation();
will(returnValue(currentLocation));
}});
final Square newLoc = new Square();
context.checking(new Expectations() {{
oneOf (b).getSquare(currentLocation, roll1 + roll2);
will(returnValue(newLoc));
}});
context.checking(new Expectations() {{
oneOf (p).setLocation(newLoc);
}});
pl.takeTurn(d,p,b);
context.assertIsSatisfied();
}
}
就像我以前喜欢JMock一样,我不得不同意Mockito使用起来更友好的评论。如果你刚刚开始嘲笑,现在可能是转换的好时机。