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));
}
}
Crap. Vielen Dank. Das war übrig geblieben, bevor ich Mockito für einen handgemachten Stummel ersetzte. – michaelAdam
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
Irgendeine Idee, warum meine Frage abgelehnt wurde? – michaelAdam