2016-06-15 4 views
-1

Wenn ich den JUnit-Test, ShuffleTest, ich bekomme die Antwort, "Wanted, aber nicht aufgerufen: shuffler.shuffle();" Ich habe diese Frage viele Male auf SO gestellt, aber soweit ich das beurteilen kann, tue ich was diese Antworten sagen. Ich instanziiere meine Schnittstelle als Mock und injiziere sie in meine Deck-Klasse. Warum wird es nicht aufgerufen?Warum wird meine Scheinmethode nicht aufgerufen?

public enum Suit { 
    SPADE("BLACK"), 
    CLUB("BLACK"), 
    HEART("RED"), 
    DIAMOND("RED"); 

    private final String color; 
    Suit(String color) { 
     this.color = color; 
    } 
} 

public enum Rank { 
    ACE, TWO, THREE, FOUR, FIVE, SIX, 
    SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING; 

} 


public class Card { 
    private Suit suit; 
    private Rank rank; 

    public Card(Rank rank, Suit suit) { 
     this.rank = rank; 
     this.suit = suit; 
    } 

    public Suit getSuit() { 
     return suit; 
    } 

    public Rank getRank() { 
     return rank; 
    } 

    public String toString() { 
     return suit + " of " + rank + ";"; 
    } 
} 

public class Deck { 

    private List<Card> cards; 
    private Shuffler shuffler; 

    public Deck(Shuffler shuffler) { 
     this.cards = new LinkedList<Card>(); 
     this.shuffler = shuffler; 
     shuffler.shuffle(this.cards); 
     System.out.println("class " + shuffler.getClass()); 
    } 

    public void shuffle() { 
     shuffler.shuffle(this.cards); 
    } 
    public void addCard(Card card) { 
     cards.add(0, card); 
    } 

} 

public interface Shuffler { 
    public <T> void shuffle(List<T> items); 
} 
public class TestDeck { 
    private Deck deck; 
    private Shuffler mockShuffler; 

    public static Deck createFullDeck(Shuffler shuffler) { 
     shuffler = mock(Shuffler.class); 
     Deck deck = new Deck(shuffler); 
     for(Suit s : Suit.values()) { 
      for(Rank r : Rank.values()) { 
       deck.addCard(new Card(r, s)); 
      } 
     } 
     return deck; 
    } 

    @Before 
    public void before() { 
     mockShuffler = mock(Shuffler.class);   
     deck = createFullDeck(mockShuffler); 
    } 



    @Test 
    public void ShuffleTest() { 
     doAnswer(new Answer<Void>() { 
      public Void answer(InvocationOnMock invocation) throws Throwable { 
       System.out.println("Everyday I'm Shuffling"); 
       return null; 
      } 

     }).when(mockShuffler).shuffle(Matchers.anyListOf(Card.class)); 

     deck.shuffle(); 
     verify(mockShuffler, times(1)).shuffle(Matchers.anyListOf(Card.class)); 
    } 
} 

Antwort

3

Sie erstellen zwei separate Shuffler-Objekte. Versuchen Sie, shuffler = mock(Shuffler.class); aus der createFullDeck Methode zu entfernen, da shuffler bereits eine Kopie ist, wenn sie übergeben wird.

+0

Crap. Vielen Dank. Das war übrig geblieben, bevor ich Mockito für einen handgemachten Stummel ersetzte. – michaelAdam

+0

Beachten Sie, dass der Mock nach dieser Änderung zweimal aufgerufen wird: 1 im Konstruktor von 'Deck', 1 nach dem Aufruf der' shuffle() 'Methode; Der Test wird also immer noch fehlschlagen. – Tunaki

+0

Irgendeine Idee, warum meine Frage abgelehnt wurde? – michaelAdam