2016-06-15 7 views
-1

JUnitテストShuffleTestを実行すると、「欲しいが呼び出されていない: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

2つの別々のシャッフラーオブジェクトを作成しています。 shufflerが渡されたときに既に模擬であるため、をcreateFullDeckメソッドから削除してみてください。

+0

クラップありがとうございました。それは私がMockitoを手作りのスタブに置き換える前から残されていました。 – michaelAdam

+0

この変更の後、模擬は 'Deck'のコンストラクタで1回、' shuffle() 'メソッドを呼び出した後に1回、2回呼び出されます。テストは失敗します。 – Tunaki

+0

なぜ私の質問が下落したのか、 – michaelAdam

関連する問題