سؤال

أعتقد أنني لا أستخدم verify بشكل صحيح. ها هو الاختبار:

@Mock GameMaster mockGM;    
Player pWithMock;

@Before
public void setUpPlayer() throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
    pWithMock = new Player(mockGM);
}

@Test
    public void mockDump() {
        pWithMock.testDump();
        verify(mockGM).emitRandom(); // fails
    }

هنا هو الكود الذي يتصل به:

public boolean testDump() {
    Letter t = tiles.getRandomTile();
    return dump(t);
}

private boolean dump(Letter tile) {
            if (! gm.canTakeDump() || tiles.count() == 0) {
        return false;
    }

    tiles.remove(tile);
    gm.takeTile(tile);
    for (int i = 0; i < 3; i++) {
        tiles.addTile(gm.emitRandom()); // this is the call I want to verify
    }
    return true;
}

تتبع الفشل:

Wanted but not invoked:
gameMaster.emitRandom();
-> at nth.bananas.test.PlayerTest.mockDump(PlayerTest.java:66)

However, there were other interactions with this mock:
-> at nth.bananas.Player.dump(Player.java:45)

    at nth.bananas.test.PlayerTest.mockDump(PlayerTest.java:66)

المكالمة التي أريد التحقق منها هي عدة طبقات لأسفل. هل هناك طريقة مختلفة للتحقق من هذا؟

هل كانت مفيدة؟

المحلول

هناك خطأ في طريقة الاختبار الخاصة بك: إنه يفتقد التوقعات اللازمة ل GameMaster#canTakeDump(). هذه الطريقة تحتاج إلى العودة true عندما تم استدعاؤها من الطريقة التي تم اختبارها (بسبب استخدامها في ذلك if بيان في السطر 45).

نصائح أخرى

لست متأكدًا من فهم ما تفعله. بالنظر إلى ما يلي Player صف دراسي:

public class Player {
    private final GameMaster gm;

    public Player(GameMaster gameMaster) {
        this.gm = gameMaster;
    }

    public void foo() {
        gm.bar(); // this is the call we want to verify
    }
}

وما يلي GameMaster صف دراسي:

public class GameMaster {
    public GameMaster() {
    }

    public void bar() {
    }
}

سأكتب اختبار Player مثله:

import static org.mockito.Mockito.verify;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)
public class PlayerTest {

    @Mock
    private GameMaster gm;

    @Test
    public void testFoo() {
        Player player = new Player(gm);
        player.foo();
        verify(gm).bar(); // pass
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top