2016-04-13 10 views
1

Ich versuche, Junit Tests für einen Parser zu schreiben. Dieser Parser erstellt ein Diagramm mit Scheitelpunkten und Kanten aus einer ausgewählten Datei. Im Parser rufe ich oft den Konstruktor von "VertexImpl" auf, um die benötigten Scheitelpunkte zu erzeugen.Guice And Mockto für Junits

Wenn ich den Parser testen möchte ich nicht tatsächlichen "VertexImpl" -Objekt erstellen, weil ich will, dass es eine echte Komponententest.

Wie mache ich jedes Mal ein Mock-Objekt, wenn der Konstruktor mit "Mockito" und "Guice" aufgerufen wird?

+0

Junit + Guice + Mockito = https://github.com/ArcBees/Jukito –

Antwort

1

Wenn Sie nicht möchten, dass Ihr Parser bestimmte Objekte erstellt; Gut; Schreiben Sie es dann neu, um solche Objekte nicht zu erstellen.

Was ich meine ist: Ihr Parser sollte ein "Factory" -Objekt haben, das der Parser verwenden kann, um solche VertexImpls zu erstellen. Für Ihren Komponententest "verspotten" Sie diese Fabrik; Dadurch haben Sie die volle Kontrolle darüber, was der Parser tun soll.

Bitte beachten Sie: Der zu testende Code ist derselbe für den Komponententest und die Produktionsnutzung. Der einzige Unterschied: Bei der Einrichtung des Einheitentests ist das Factory-Objekt anders (Sie möchten über die Abhängigkeitsinjektion lesen, wie das geht).

+0

Also, soll ich mein Parser vorübergehend nur für das ändern Gerätetest? –

+0

Nein; Ich habe die Antwort aktualisiert, um das deutlicher zu machen. – GhostCat

+0

Irgendwelche Tutorials wie man es mit Mockito und Guice macht? –

1

Sie können in Ihrer Testklasse so etwas tun:

@Inject 
private YourClassToMock _myMock; 

@Before 
public void setUp() throws Exception { 
    Guice.createInjector(/* Your application modules */, mockModule()) 
     .injectMembers(this); 
} 

private Module mockModule() { 
    return new AbstractModule() { 
     @Override 
     protected void configure() { 
      bind(YourClassToMock.class).toInstance(mock(YourClassToMock.class)); 
     } 
    }; 
} 

Das Feld _myMock, Instanz von YourClassToMock, wird für diesen Test als Mock injiziert werden, und andere Felder werden in der Regel wie in der Produktion injiziert werden (aufgrund der Verwendung Ihrer Anwendungsmodule).

Achten Sie darauf, können Sie nicht eine Injektion definieren zweimal