2010-12-09 2 views
2

Ist es in Mockito möglich zu überprüfen, ob eine Methode auf einem Schein aufgerufen wurde, basierend darauf, ob der Schein tatsächlich in der geprüften Einheit verwendet wurde?Mockito bedingte Überprüfung mit Fabriken

Für ein einfaches Beispiel, ich liefern eine Scheinfabrik (FooFactory) zu meiner Einheit unter Test, und wenn Foo.create() aufgerufen wird, gibt es einen Schein (Foo), um von bestimmten Methoden in der verwendet werden zu testende Einheit. Wie kann ich überprüfen, dass Foo.method() nur aufgerufen wird, wenn Foo.create() von der zu testenden Einheit aufgerufen wurde?

Ich Vorstellungsvermögen, dass der Code in etwa so aussehen würde:

@Before 
public void init() { 
    Foo mockFoo = mock(Foo.class); 
    when(fooFactory.create()).thenReturn(mockFoo); 
    test = new UnitUnderTest(fooFactory); 
} 

@Test 
... may or may not create a foo ... 

@After 
public void cleanup() { 
    if (verify(fooFactory).create()) { // Here's the 'conditional verification' 
    Foo mockFoo = fooFactory.create(); 
    verify(mockFoo).close(); 
    } 
} 

geschlossen Für ein wenig mehr konkretes Beispiel, gibt mein Werk ein Reader-Objekt, das ich will, um sicherzustellen, aber nicht jedes Verfahren in Die Klasse konstruiert tatsächlich einen Reader. Ich könnte natürlich die Überprüfung zu jedem Test hinzufügen, wo ich weiß, dass der Reader benötigt wird, aber das scheint eine Menge Doppelaufwand zu sein.

Antwort

1

Sind Sie sicher, dass Sie diesen Test schreiben möchten?

kann ich zwei Lösungen finden Sie unter:

1) Sie wirklich wollen, um sicherzustellen, dass die Ressource erstellt wird und geschlossen, so versuchen, einen Test zu schreiben, wo Sie beiden Methodenaufrufe überprüfen können.

2) Sie möchten sicherstellen, dass beim Öffnen der Ressource auch diese geschlossen wird. Dies könnte als Assertion im Produktionscode implementiert werden ...

Wenn Sie wirklich mit Ihrem Ansatz fortfahren möchten, könnten Sie die Ausnahme abfangen, die die erste Überprüfung auslöst, wenn die create() -Methode nicht aufgerufen wurde . Im Fang kommst du einfach zurück.

Auch sollten Sie nicht die Überprüfung in der Bereinigung, sondern in der eigentlichen Testmethode.

+0

+1. Sie können für beide Fälle einen separaten Komponententest erstellen (z. B. testWasInteraction, testNoInteraction) und haben keine weiteren Verifizierungsmethoden in Aufräummethoden. Unterste Zeile - wenn Sie diese Überprüfung wünschen, schreiben Sie einen spezifischen Komponententest. Am Ende, wenn es einen Fehler gibt, würden Sie einen Testfehler sehen, nicht mehrere Fehler in jedem Testfall, der diese Methode verwendet. –

0

Ehrlich klingt es wie Ihr Test zu kompliziert ist. Es war meine Erfahrung mit vielen Projekten und vielen Unit-Tests, dass der beste Weg, um mit den Dingen umzugehen, darin besteht, sicherzustellen, dass jeder Test nur eine Sache testet. Sie können so viele Behauptungen haben, wie Sie möchten, aber es sollte eine Methode aufgerufen und ein Szenario getestet werden. Alles mo und der Test wird zu komplex. Außerdem wird es anderen Entwicklern sehr schwer fallen, den Test zu einem späteren Zeitpunkt bei der Entwicklung der App aufzunehmen.

Also würde ich vorschlagen, Ihren Test in mehrere Tests zu zerlegen, einen pro Szenario und dann sehen, ob Sie das noch brauchen.