2009-12-27 4 views
2

Je pense que je n'utilise pas correctement verify. Voici le test:Java: Mock test probablement avec Mockito

@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 
    } 

est ici le code appelle:

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; 
} 

trace d'échec:

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) 

L'appel que je veux vérifier plusieurs couches est vers le bas. Existe-t-il un moyen différent de vérifier cela?

+0

+1 pour 'gm.canTakeDump()' – grinch

Répondre

0

Il y a une erreur dans votre méthode de test: il manque une attente nécessaire pour le GameMaster#canTakeDump(). Cette méthode doit renvoyer true lorsqu'elle est appelée à partir de la méthode testée (en raison de son utilisation dans l'instruction if à la ligne 45).

0

Je ne suis pas sûr de comprendre ce que vous faites. Compte tenu de la classe Player suivante:

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 
    } 
} 

Et la classe GameMaster suivante:

public class GameMaster { 
    public GameMaster() { 
    } 

    public void bar() { 
    } 
} 

j'écrire le test de Player comme ceci:

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 
    } 
} 
+0

Je ne sais vraiment pas ce que je fais. En quoi est-ce différent de ce que j'ai posté? –

+0

aussi, et si la classe GameMaster n'a pas de constructeur sans arguments? –

+0

@Rosarch * Comment est-ce différent? * Je ne suis pas tout à fait sûr car vous n'avez pas montré tout le code mais, bon, ça marche :) * Et si le GameMaster n'a pas de constructeur sans args? * Eh bien, C'est un exemple mais si vous avez besoin d'ajouter ce constructeur pour rendre le code testable, faites-le. –

Questions connexes