2016-06-15 289 views
-1

当我运行JUnit测试ShuffleTest时,我得到的响应是“Wanted but not invoked:shuffler.shuffle();” 我在这个问题上看到过很多次这样的问题,但据我所知,我正在做那些答案。我将我的界面实例化为模拟,并将其注入到我的Deck类中。为什么它没有被调用?为什么我的模拟方法没有被调用?

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

回答

3

您正在创建两个独立的混洗器对象。尝试从createFullDeck方法中删除shuffler = mock(Shuffler.class);,因为shuffler传入时已经是模拟。

+0

垃圾。谢谢。这是从我取代Mockito手工制作的存根之前剩下的。 – michaelAdam

+0

注意,在这个改变之后,模拟被调用2次:在Deck的构造函数中1,在调用shuffle()方法后调用1;所以测试仍然会失败。 – Tunaki

+0

任何想法为什么我的问题已被downvoted? – michaelAdam

相关问题