Mockito, wenn/dann-nicht wieder erwarteten Wert
Ich versuche, stub dieses getKeyFromStream Methode, mit der Verwendung von 'jeder' Matcher. Ich habe versucht, deutlicher und weniger explizite (anyObject()), aber es scheint so, egal was ich versuche, dieser stub wird nicht wieder die fooKey in meinem unit-test.
Frage ich mich, ob es ist, weil es geschützt ist oder gibt es etwas, was fehlt mir oder mache es falsch. Ich habe andere, wenn/dann-Aussagen in den tests, die arbeiten aber aus irgendeinem Grund, ist es hier nicht.
Hinweis: Die getKeyFromStream verwendet in der Regel einen byteArrayInputStream, aber ich bin versucht, es mit einem InputStream, ich habe versucht, beide ohne Erfolg.
public class FooKeyRetriever() //Mocked this guy
{
public FooKey getKey(String keyName) throws KeyException {
return getKeyFromStream(getKeyStream(keyName, false), keyName);
}
//Stubbed this method to return a key object which has been mocked
protected FooKey getKeyFromStream(InputStream keyStream, String keyName){
//Some code
return fooKey;
}
}
Unit-Test
@Mock
private FooKeyRetriever mockKeyRetriever;
@Mock
private FooKey fooKey;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
}
@Test
public void testGetFooKey() throws Exception {
when(foo.getKeyFromStream(any(InputStream.class),any(String.class))).thenReturn(fooKey);
FooKey fooKey = mockKeyRetriever.getKey("irrelevant_key");
assertNotNull(fooKey);
}
- Glaube nicht, dass
protected
Methode können gekürzte nur mit Mockito. Was passiert, wenn Sie stubgetKey
? - Wie sind Sie mit der Initialisierung mockFooKey?
- Sorry, ich habe gerade ergänzt, dass es. Mock Anmerkungen.
- Sie versuchen, stub Anrufe von irgendwelchen Objekt
foo
aber test für die Ergebnisse, die von einem anderen Objekt zumockFooKey
; offensichtlich kann das nicht funktionieren - Wenn ich die stub getKey funktioniert es
- Tschad - das ist, wie Sie Sie initialisieren foo. Was mockFooKey?
- Ich habe formatiert Ihren code wie...aber dein test ist nicht in einer Methode annotiert mit
@Test
. War das ein Versäumnis? - Die gleiche Weise, ich werde aktualisieren, aber Sie sind alle mock-Anmerkungen
- Richtig, aber wo bekommt man mockFooKey zu verwenden, die mock-Verhalten konfiguriert auf foo?
- Ich aktualisierte den code, ich glaube, ich hatte einen semantischen Fehler. Ich bin verspotten die Schlüssel zurückgegeben werden und die retriever selbst. Dann füge ich das Verhalten zurückzukehren, die spotten-Taste, wenn die mock-retriever macht ein Anruf mit einer bestimmten Signatur.
- sorry, ich reparierte diese besser zu reflektieren meine-code.
- Ist das wirklich die kompletten test-code? Ich Frage mich, ob es noch kompiliert! So weit ich bin mir bewusst,
@Mock
und@Before
Anmerkungen sowie Ihre accompagnion Felder und Methoden deklariert werden müssen, die außerhalb der test-Methode selbst, sondern innerhalb der test-Klasse. Darüber hinaus sollten Sie nicht verhöhnen die Klasse, die Sie testen, aber alle seine Abhängigkeiten! Weiter, kehren Sie ein Objekt in Ihremwhen(...).thenReturn(...)
Aussage, die initialisiert danach? Ist das wirklich Eure Absicht? - Außerdem, wie @SotiriosDelimanolis hat darauf hingewiesen,
protected
Methoden zu verspottet anders
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sich das problem mit dem unit-test ist, dass Sie versuchen, zu verspotten, eine Methode der aktuellen Klasse, die Sie testen wollen, aber man kann nicht wirklich berufen, ein mock-Methode wie hier wird null zurückgegeben, es sei denn, Sie deklarieren eine verspottet Rückgabewert auf, dass die aufgerufene Methode. In der Regel, Sie nur zu verspotten externe Abhängigkeiten.
Gibt es eigentlich zwei Möglichkeiten zum erstellen von test-Objekte:
mock
undspy
. Der primer wird erstellen Sie ein neues Objekt basierend auf der Klasse, die Sie zur Verfügung gestellt, die mit einem internen Zustand null und auch wieder zurücknull
auf jede aufgerufene Methode. Das ist, warum Sie benötigen, um zu definieren, bestimmte Rückgabewerte von Methodenaufrufen.spy
auf der anderen Seite schafft ein echtes Objekt und fängt die Methodenaufrufe, wenn "mock-Definitionen" definiert sind, für bestimmte Methoden.Mockito und PowerMock bietet zwei Möglichkeiten der Definition von Ihr verspottet Methoden:
oder
Der Unterschied ist, dass die
method 1
wird, führen Sie die Methoden, Umsetzung, während das später nicht. Dies ist wichtig, wenn Sie sich mitspy
Objekte, wie Sie manchmal nicht ausführen wollen den echten code in die aufgerufene Methode sondern einfach nur den code zu ersetzen oder zurückgeben einem vordefinierten Wert!Obwohl Mockito und PowerMock bieten eine
doCallRealMethod()
dem Sie festlegen können, stattdoReturn(...)
oderdoThrow(...)
diese wird aufgerufen, und führen Sie den code in Ihrem realen Objekt und ignoriert alle verspottet Methode return-Anweisungen. Obwohl, dies ist nicht sinnvoll, dass in Ihrem Fall, wo Sie wollen, zu verspotten, eine Methode der Klasse unter test.Einer Methode, die Umsetzung kann "überschrieben" durch
wo Sie kann einfach erklären, was die Logik der Methode aufgerufen werden soll. Sie nutzen dies wieder die mock Ergebnis der protected-Methode daher so:
Den code oben funktioniert, aber beachten Sie, dass dies die gleichen semantischen als einfach erklären return Wert für die
getKey(...)
alsVersucht zu ändern nur
getKeyFromStream(...)
mit so etwas wie dies:ohne änderung
getKey(...)
von Ihrem System-Unter-Test (SUT) nicht alles erreichen, was als der eigentliche code dergetKey(...)
ausgeführt werden würde. Wenn Sie jedoch verspotten die sut-Objekt, Sie konnte nicht die Methode aufrufen, die in Ihrem//Act
Abschnitt als würde dieser den Wert null zurückgeben. Wenn Sie versuchenauf ein mock-Objekt, das wirkliche Methode woulb genannt werden und als mentiond vorher, dies würde auch aufrufen, den realen Implementierungen von
getKeyFromStream(...)
undgetKeyStream(...)
egal was Sie angegeben haben, als mock-Methode.Wie Sie wahrscheinlich sehen können, von sich selbst, Spott Methoden der aktuellen Klasse unter test ist nicht nützlich und bringt mehr Belastung für Sie als bietet keine gute. Also, es ist bis zu Ihnen oder Ihrem Unternehmen die Politik, wenn Sie wollen oder brauchen, um zu testen private/protected-Methoden, oder, wenn Sie den stick zu testen-nur die öffentliche API (was ich empfehlen würde). Sie haben auch die Möglichkeit,umgestalten von code, um zur Verbesserung der Testbarkeit obwohl die primäre Absicht der Umgestaltung sollte sein,verbessern das gesamte design Ihres Codes.