Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 不管期望值如何,jMock都会失败_Java_Jmock - Fatal编程技术网

Java 不管期望值如何,jMock都会失败

Java 不管期望值如何,jMock都会失败,java,jmock,Java,Jmock,我目前正在尝试做一个垄断游戏的模拟测试类 我们已经得到了一些关于如何设置它的说明,但也许我们只是误解了JMock的工作原理 我们有一个Player类,它使用takeTurn()。我们有Die、Board和Piece,这些都是支持模拟的接口。然后我们有一个Square类,它不包含任何值,只是用来表示一个正方形。也许我们应该让它成为一个接口,因为它什么都不包含,但我不知道 无论我们做什么,测试总是失败。我试着省略一些部分,这样我们也只能做一个期望,但没有运气。我们是不是完全误解了杰莫克 这是我们的玩

我目前正在尝试做一个垄断游戏的模拟测试类

我们已经得到了一些关于如何设置它的说明,但也许我们只是误解了JMock的工作原理

我们有一个Player类,它使用
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();
    }
}