Java 不管期望值如何,jMock都会失败
我目前正在尝试做一个垄断游戏的模拟测试类 我们已经得到了一些关于如何设置它的说明,但也许我们只是误解了JMock的工作原理 我们有一个Player类,它使用Java 不管期望值如何,jMock都会失败,java,jmock,Java,Jmock,我目前正在尝试做一个垄断游戏的模拟测试类 我们已经得到了一些关于如何设置它的说明,但也许我们只是误解了JMock的工作原理 我们有一个Player类,它使用takeTurn()。我们有Die、Board和Piece,这些都是支持模拟的接口。然后我们有一个Square类,它不包含任何值,只是用来表示一个正方形。也许我们应该让它成为一个接口,因为它什么都不包含,但我不知道 无论我们做什么,测试总是失败。我试着省略一些部分,这样我们也只能做一个期望,但没有运气。我们是不是完全误解了杰莫克 这是我们的玩
takeTurn()
。我们有Die
、Board
和Piece
,这些都是支持模拟的接口。然后我们有一个Square
类,它不包含任何值,只是用来表示一个正方形。也许我们应该让它成为一个接口,因为它什么都不包含,但我不知道
无论我们做什么,测试总是失败。我试着省略一些部分,这样我们也只能做一个期望,但没有运气。我们是不是完全误解了杰莫克
这是我们的玩家课程:
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();
}
}
模仿背后的想法是,你制造出可以设定期望值的假对象。期望包括将调用哪些方法以及将从这些方法返回哪些结果 后一项任务是您在当前代码中遗漏的内容。您需要告诉JMock对模拟对象的方法调用将返回哪些值。如果未告知JMock,则默认值为
null
,0
,false
等
例如,您声明希望掷两个骰子,但未提供模拟的dice
对象应返回的返回值。因此JMock将只返回0
。稍后,假设这两个卷的总和为5
,这是错误的
您的代码应该更改为大致类似(未测试):
尽管我过去很喜欢JMock,但我必须同意Mockito使用起来更友好的评论。如果您刚刚开始模拟,现在可能是切换的好时机。查看JMock失败消息会很有帮助。在我们展示的教程中,根本不需要返回值。@Vipar查看您的示例,我认为您需要返回值。不过,在某些情况下,它们是不需要的。嗯,它起了作用。谢谢我也会看看那个莫基托的东西。
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();
}
}