无论期望如何,jMock都失败了

时间:2014-03-27 11:46:14

标签: java jmock

我目前正在尝试进行垄断游戏的模拟测试课程。

我们已经获得了一些关于如何设置其中一些内容的说明,但也许我们只是误解了JMock的工作原理。

我们有使用takeTurn()的Player类。我们有DieBoardPiece这些都是支持嘲弄的接口。然后我们有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();
    }
}

1 个答案:

答案 0 :(得分:1)

嘲笑背后的想法是你制作虚假物品,你可以在上面设定期望值。期望包括将调用哪些方法以及从这些方法返回哪些结果。

后一项任务是您在当前代码中遗漏的内容。您需要告诉JMock通过模拟对象上的方法调用返回哪些值。如果没有告诉JMock,它默认为null0false等值。

例如,您声明您预计会有两个骰子,但您没有提供被模拟的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使用起来更友好的评论。如果你刚刚开始嘲笑,现在可能是转换的好时机。