AnyString() als parameter für unit-test
Habe ich, um mit einer legacy-Anwendung, hat keine tests. So, bevor ich anfange refactoring-ich möchte sicherstellen, dass alles funktioniert, wie es ist.
Nun stellen Sie sich folgende situation vor:
public SomeObject doSomething(final OtherObject x, final String something) {
if(x == null) throw new RuntimeException("x may not be null!");
...
}
Nun möchte ich testen, ob null-check, so sicher sein, es funktioniert und ich nicht verlieren ich es mal umgestalten.
Also ich habe das
@Test(expected = RuntimeException.class)
public void ifOtherObjectIsNullExpectRuntimeException() {
myTestObject.doSomething(null, "testString");
}
Nun, das funktioniert natürlich.
Aber anstelle von "testString" ich würde Sie gerne weitergeben, in einer zufälligen Zeichenfolge.
Also habe ich versucht mit:
@Test(expected = RuntimeException.class)
public void ifOtherObjectIsNullExpectRuntimeException() {
myTestObject.doSomething(null, Mockito.anyString());
}
Aber ist dies nicht erlaubt., wie bekomme ich
org.mockito.Ausnahmen.missbrauchen.InvalidUseOfMatchersException:
... Sie nicht verwenden können, argument-Matcher außerhalb von überprüfungen oder stubbing
Ich verstehe den Sinn, aber ich Frage mich, ob ich noch weiter kann, das zu tun, was ich will, ohne Parametrierung mein test oder ähnliches.
Nur Bibliotheken, die ich verwenden können, Junit, AssertJ, Mockito und Powermock.
Irgendwelche Ideen?
InformationsquelleAutor Sorona | 2016-09-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, wie Mockito ist versucht zu sagen, über diese Ausnahme, das ist nicht wirklich, wie Sie möchten, verwenden
anyString
. Solche Methoden sind nur für die Verwendung durch verspottet.Also, warum nicht versuchen, testen, mit einem tatsächlichen random string? Mein persönlicher Favorit in einem solchen Szenario:
java.util.UUID.randomUUID()
.toString()
. Dies wird praktisch immer erzeugen Sie eine Marke neue Zeichenfolge, die noch nie verwendet wurde für den test vor.Ich möchte auch hinzufügen, dass, wenn Sie schreiben tests für Ihre
SomeObject
Klasse, die Sie vermeiden sollten mockingSomeObject
's Verhalten. Von Ihrem Beispiel, Sie waren nicht gerade gut, aber es sah aus wie Sie sein könnte, geht unter, die route. Spotten die Abhängigkeiten von der Implementierung, Sie versuchen zu testen, nicht die Umsetzung selbst! Dies ist sehr wichtig; andernfalls sind Sie nicht wirklich testen, nichts.Auch, randomUUID() wird nie null zurückgeben ist, soweit ich weiß, also, dass ist ein großer Nachteil.
Bitte siehe java.util.Random. Alles, was Sie brauchen für Tests mit zufälligen Werten, die dort gefunden werden können. Auch, wenn Sie wollen, um zu testen, die speziell für einen null-Wert, das sollte eine separate Einheit testen. Unit-tests sollen Billig sein und schnell; habe keine Angst, fügen Sie einen neuen Testfall, wo Sie denken, es ist notwendig!!!
Und danke, aber natürlich habe ich verspotte die Umsetzung der Abhängigkeiten, z.B. wenn ein service aufgerufen wird, die ich tun
doReturn(false).when(dependencyService).isXValid(INVALID_VALID_X);
Ich glaube nicht, dass es notwendigerweise zu einem anderen (unit -) test. Null-Werte sind oft etwas, was man zu tun hat, mit manuell, das ist richtig, so ist es ein edge-case. Aber manchmal ist die API sagt (implizit), dass etwas, das nicht null sein darf, doch plötzlich ein wildes null erscheint und bricht alles, denn es ist kein unit-test, weil "die api sagte, es kann nicht null sein, also warum prüfen?" (Wir hatten das, den anderen Tag -.-) Also würde ich das gerne automatisieren mehr und mehr von der test-generation. Gehen BDD im Grunde.
InformationsquelleAutor nasukkin
Tests sollte deterministisch sein. Die Verwendung zufälliger Werte in einem test, der es schwierig macht, um Verhalten zu reproduzieren, wenn debugging ein test fehlgeschlagen. Ich schlage vor, daß Sie erstellen Sie einfach eine
String
Konstante für den test wie"abcdefg"
.Parametrisierte tests können durchaus deterministisch sein.
Sie können, ja, aber Sie sind nicht immer. Naja, eigentlich, wenn Sie wickeln Sie Ihren Kopf um die Rahmenbedingungen und die Zufälligkeit in der informatik sind Sie wahrscheinlich immer "deterministisch" 😉 immer Noch, was ich versuche, hier zu tun ist, stellen Sie sicher, dass, egal der zweite parameter, es sollte immer fehl. Deshalb will ich erhöht meine Chancen, dass wenn ein bestimmter Gegenstand kommt es nicht zu brechen, meine Umsetzung. Tests laufen im Grunde 24/7, also statistisch...
Es klingt wie Sie wahrscheinlich benötigen, um diesen test parametriert werden. Wie Sie wahrscheinlich wissen, sollten Sie haben die Möglichkeit, den Wert der zufälligen Zeichenfolge in Fall gibt es Probleme, die Sie Debuggen müssen.
Ich kann immer log die aktuellen Werte, wenn der test fehlgeschlagen ist 😉
InformationsquelleAutor Code-Apprentice
Mischen Sie Konzepte hier.
All diesen "Spott" Helfer wie anyString() werden sollte verwendet werden, wenn die Konfiguration eines mock Objekt.
Aber wenn Sie überprüfen Ihre Prüfung code:
werden Sie finden: es ist absolut keine Verspottung beteiligten für diesen test. Sie einfach nicht verwenden Sie diejenigen, die Mokito fordert in diesem Ort; denn "es gibt keine Mokito".
Und nur für das Protokoll - keine Notwendigkeit, über Bord gehen hier sowieso. Ihre Logik ist hier sehr deutlich: wenn das erste argument null ist, dann Sie werfen der Ausnahme. Also es ist wirklich egal, was kommt, als zweites argument. Also, denken Sie für eine Stunde, wie um zu testen, null mit jeder zweiten argument ist, nun, in meinen Augen: Verschwendung von Ihrer Zeit.
Letzte Tipp: es gibt java.lang.Objekte
Und diese Klasse hat einen schönen check für null, so dass meine Produktion code sieht nur aus wie
Einzige Unterschied: erfordert... wirft NullPointerExceptions
Finale schließlich: einige Menschen behaupten zu setzen, endgültig auf alle parameter; aber ich würde das nicht tun. Es fügt keine Wert in 99% aller Fälle. Es bedeutet nur, dass Sie mehr code zu Lesen; für keine gibt es gute Gründe. Aber das ist eine Frage des Stils.
BEARBEITEN auf den Kommentar darüber, dass ein test, um zu überprüfen, für mögliche zukünftige änderungen: Sie sollte das nicht tun:
Und vielleicht eine andere Sicht; wie ich denke immer noch, Sie verschwenden Ihre Zeit hier! Sie sollten sicherstellen, dass alle Schnittstellen sind klar, einfach zu verstehen und einfach zu bedienen. Sie können die Benutzer von Ihrem code das richtige zu tun, einfach; und ihn davon abhalten, das falsche zu tun. Das ist das, was Sie sich konzentrieren sollten auf die Qualität Ihrer Schnittstellen als ganzes!
Also anstatt sich Gedanken, wie Sie schreiben, könnte ein test für mögliche zukünftige Veränderungen; so stellen Sie sicher, dass Ihre code-Basis ist insgesamt konsistent.
if(a && !b)
stattif(a)
... ich möchte eine Möglichkeit zu haben, ein test, der sicherstellt, dass nur das erste argument verwendet, dass der check.InformationsquelleAutor GhostCat
Nun, ich habe nicht viel wissen von mockito, aber Sie können immer erstellen Sie Ihre eigene random string generator. vielleicht kann arbeiten und u verändern können mehrere Typen von Eingaben in es
InformationsquelleAutor Jashan Preet