2014-11-03 10 views
5

Wie Implementierungen von Guice AbstractModule in einem großen Projekt zu testen, ohne gefälschte Implementierungen zu erstellen? Ist es möglich, bind() und inject() Methoden zu testen?Wie Implementierungen von Guice AbstractModule zu testen?

+3

Sie möchten nicht das Framework testen, also vertrauen Sie einfach guice, dass binden und injizieren sind gut. Wenn Sie Ihre Modulimplementierungen testen möchten, werfen Sie einen Blick auf Modules.Overwrite. Sie können Ihre Produktionsmodule beibehalten und nur so viel Fälschungs-/Mock-Zeug überschreiben, dass Sie sie trotzdem problemlos testen können. –

Antwort

4

In der Regel besteht die beste Methode zum Testen von Guice-Modulen darin, nur einen Injektor in Ihrem Test zu erstellen und sicherzustellen, dass Sie Instanzen von Schlüsseln erhalten, die Ihnen wichtig sind.

Um dies zu tun, ohne dass Produktionsfehler auftreten, müssen Sie möglicherweise einige Module durch andere Module ersetzen. Sie können Modules.override verwenden, um einzelne Bindungen selektiv zu überschreiben, aber normalerweise ist es besser, wenn Sie keine Module vom Typ "Produktion" installieren und stattdessen gefälschte Bindungen verwenden.

Seit Guice 4.0 gibt es eine Helferklasse BoundFieldModule, die dabei helfen kann. Ich gründen oft Tests wie:

public final class MyModuleTest { 
    @Bind @Mock DatabaseConnection dbConnection; 
    @Bind @Mock SomeOtherDependency someOtherDependency; 

    @Inject Provider<MyThing> myThingProvider; 

    @Before public void setUp() { 
    MockitoAnnotations.initMocks(this); 
    Guice.createInjector(new MyModule(), BoundFieldModule.of(this)) 
     .injectMembers(this); 
    } 

    @Test public void testCanInjectMyThing() { 
    myThingProvider.get(); 
    } 
} 

Es gibt mehr documentation for BoundFieldModule auf dem Guice Wiki.

+0

Vielen Dank für die Antwort. Entschuldigung, aber ich kann die ** BoundFieldModule ** Klasse und die ** @ Bind ** Annotation nicht auflösen. – Nikolas

+1

@ Nikolas: Sie können das gleiche tun, indem Sie einfach eine anonyme "AbstractModule" Unterklasse in Ihrem Test erstellen, natürlich - "BoundFieldModule" ist nur eine Abkürzung. (Wenn es in Ihrem Projekt nicht verfügbar ist, möchten Sie vielleicht Guice auf die neueste Version upgraden.) Der wichtigste Teil der Antwort ist, dass der beste Weg, um sicherzustellen, dass Ihre Abhängigkeiten korrekt sind, nur ein 'Injector' in Ihrem Test ist, und verifizieren, dass es wie erwartet funktioniert. –