Wie kann ich testen, Guice Injektionen?
Gab ich zu Google Guice in der Verantwortung der Verkabelung meiner Objekte. Aber, wie kann ich testen, ob die Bindungen sind gut funktioniert?
Angenommen wir haben eine Klasse A
die eine Abhängigkeit B
. Wie kann ich testen, dass B eingespritzt, richtig?
class A {
private B b;
public A() {}
@Inject
public void setB(B b) {
this.b = b
}
}
Beachten Sie, dass A
hat kein getB()
Methode und ich möchte behaupten, dass A.b
ist nicht null
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für eine komplexe Guice-Projekt, sollten Sie tests durch, um sicherzustellen, dass die Module können verwendet werden, um erstellen Sie Ihre Klassen. In deinem Beispiel, wenn B waren einer Art, die Guice konnte nicht herausfinden, wie zu erstellen, dann Guice nicht in der Lage sein zu erstellen, Wenn A. Eine war nicht nötig, um den server zu starten, war aber notwendig, wenn Ihr server war die Bearbeitung einer Anforderung, das würde zu Problemen führen.
In meine Projekte, ich Schreibe tests für nicht-triviale Module. Für jedes Modul, das ich verwenden requireBinding() zu erklären, welche Bindungen das Modul benötigt, aber nicht definieren. In meinen tests, ich erstelle ein Guice-injector verwenden Sie das Modul unter test und ein weiteres Modul, das die benötigten Bindungen. Hier ist ein Beispiel mit JUnit4 und JMock:
Beachten Sie, wie der test fragt nur für einen Anbieter. Das reicht aus, um festzustellen, dass Guice könnte zur Lösung der Bindungen. Wenn LoginService wurde von einem Anbieter-Methode dieser test würde nicht testen Sie den code in das Anbieter-Methode.
Dieser test auch nicht testen das Sie gebunden sind, das richtige zu
UserDao
oder dassUserDao
war Gültigkeitsbereich richtig. Einige würden argumentieren, dass solche Dinge nur selten lohnt; wenn es ein problem gibt, passiert es einmal. Sie sollten "zu testen, bis Angst verwandelt zu Langeweile."Finde ich Modul-tests hilfreich, da ich oft fügen Sie neue Punkte Injektion, und es ist leicht zu vergessen, eine Bindung hinzuzufügen.
Den
requireBinding()
Gespräche können helfen, Guice fangen, fehlende Bindungen, bevor Sie gibt Ihr injector! In dem obigen Beispiel, der test würde immer noch funktionieren, wenn dierequireBinding()
Anrufe waren nicht da, aber ich mag Sie, weil Sie dienen der Dokumentation.Für kompliziertere Module (wie meine root-Modul), die ich verwenden könnte, Module.override() überschreiben Bindungen, die ich nicht wollen, dass bei der Prüfung Zeit (zum Beispiel, wenn ich will, um zu überprüfen, dass meine root-Objekt erstellt werden, die ich wahrscheinlich nicht wollen, es zu schaffen, ein Objekt, das eine Verbindung zu der Datenbank). Für einfache Projekte, die Sie vielleicht nur testen Sie die top-level-Modul.
Beachten Sie, dass Guice nicht injizieren, null-Werte, es sei denn, das Feld als kommentierte mit
@Nullable
so dass Sie sehr selten brauchen, um zu überprüfen, dass die injizierten Objekte sind die nicht-null-Wert in Ihren tests. In der Tat, wenn ich kommentieren Konstruktoren mit@Inject
ich nicht die Mühe zu prüfen, ob die Parameter sindnull
(in der Tat, meine tests sind oft injizierennull
in den Konstruktor zu halten, werden die tests einfacher).my tests often inject null into the constructor to keep the tests simple
=> das kann ein Indiz sein, dass Ihre Klasse nicht als zusammenhängendenull
in den Konstruktor ist nur selten ein problem. Wenn ich die Prüfung einer Klasse und der Methode(N) ich die Prüfung nicht verwenden Sie eine der Felder, vorbei an einemnull
für die parameter des Konstruktors die einfachste Sache zu tun. Wenn das nicht funktioniert, ich zu Spritzen, ein mock-Objekt (für Dienstleistungen) oder eine echte Instanz (für value-Objekte), sondern entweder von dieser macht der code komplizierter, als es sein würde, wenn ich bestanden innull
null
Abhängigkeit der Konstruktor im test, da die öffentlichen Methoden, die Sie aufrufen, in Ihrem test nicht auf die Abhängigkeit - fehlende zusammenhalt, per definition.B
istUserDAO
und der test nicht sicher, dass es erstellt werden können. Das Modul gewährleistet, dass, wenn Sie passierenLoginServiceModule
zuGuice.create injector()
und Guice nicht die Bindungen notwendig, umUserDao
,createInjector
wird eine Ausnahme werfenAnderen Weg, um Ihre Konfiguration testen, indem Sie eine test-suite, die die tests Ihrer app Ende-zu-Ende. Obwohl Ende-zu-Ende-tests nominell test-use-cases, die Sie indirekt überprüfen Sie, dass Ihre app richtig konfiguriert ist, (dass alle Abhängigkeiten sind WLAN, etc etc). Unit-tests auf der anderen Seite sollte sich ausschließlich auf die domain, und nicht auf den Kontext, in dem Sie Ihren code bereitgestellt wird.
Ich Stimme auch mit NamshubWriter Antwort. Ich bin nicht gegen die tests, die überprüfen Sie die Konfiguration, so lange wie Sie zusammengefasst sind in einem separaten test-suite, um Ihren unit-tests.
IMHO, sollte man nicht testen, die. Die Google Guice Jungs haben die unit-tests behaupten, dass die Injektionen zu arbeiten, wie erwartet - nach allem, was Guice ist entworfen, um zu tun. Sie sollte nur das schreiben von tests für Ihren eigenen code (A und B).
Ich glaube nicht, sollten Sie testen, private Mitglieder festgelegt wird. Besser test gegen die öffentliche Schnittstelle der Klasse. Wenn die "b" wäre nicht injiziert werden, werden Sie wahrscheinlich eine NullPointerException bei der Ausführung Ihrer tests, das sollte genug der Warnung sein.