جافا: اختبار وهمية ربما مع Mockito
-
21-09-2019 - |
سؤال
أعتقد أنني لا أستخدم 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
}
}
لا تنتمي إلى StackOverflow