2015-05-14 3 views
9

Ich bin verwirrt über den Zweck und den Unterschied zwischen Erwartungen und Überprüfungen. Z.B.Sind die Erwartungen überflüssig, wenn ich in meinem Test Verifizierungen habe?

@Tested FooServiceImpl fooService; 
@Injectable FooDao fooDao; 

@Test 
public void callsFooDaoDelete() throws Exception { 
    new Expectations() {{ 
     fooDao.delete(withEqual(1L)); times = 1; 
    }}; 

    fooService.delete(1L); 

    new Verifications() {{ 
     Long id; 
     fooDao.delete(id = withCapture()); times = 1; 
     Assert.assertEquals(1L, id); 
    }}; 
} 

Zunächst, lassen Sie mich bitte wissen, wenn dieser Test schlecht geschrieben/durchdacht ist.

Zweitens, meine Frage: die Erwartungen Abschnitt scheint mir überflüssig, und ich kann nicht mit einem Beispiel, wo es nicht sein würde.

+0

Ich habe den Titel geändert besser auf Ihre Frage am Ende der Seite zu reflektieren. Wenn ich die Frage falsch verstanden habe, kannst du meine Änderung rückgängig machen. – Thunderforge

+0

Alter Thread, ich weiß, aber mein Verständnis ist, locker und knapp: Ein 'Erwartungen' Block behandelt Dinge, die _ passieren können; Ein 'Verifikations'-Block behandelt Dinge, die passiert sein müssen. –

Antwort

12

Der Zweck Expectations ist ein Test auf Datensatz erwarteten Ergebnisse für verspotteten Verfahren und/oder Konstrukteuren zu erlauben, wie durch den im Test befindlichen Code benötigt.

Der Zweck Verifications ist ein Test auf zu ermöglichen erwarteten Invokationen zu verspotteten Verfahren und/oder Konstruktoren verifiziert, wie durch den im Test befindlichen Code vorgenommen.

Also, normalerweise ein Test würde nicht beide Rekord und die gleiche Erwartung überprüfen (wo eine „Erwartung“ zu spotten Methoden/Konstrukteuren eine Reihe von Anrufungen gibt, die auftreten, sind zu erwarten, wenn die im Test befindlichen Code ausgeübt).

Mit dem im Verstand, würde das Beispiel Test wie folgt aussehen:

@Tested FooServiceImpl fooService; 
@Injectable FooDao fooDao; 

@Test 
public void callsFooDaoDelete() throws Exception { 
    fooService.delete(1L); 

    new Verifications() {{ fooDao.delete(1L); }}; 
} 
+0

Ich verstehe das immer noch nicht. In Ihrem Beispiel könnten Sie dasselbe mit einem Erwartungsblock erreichen, oder? Wann benötigen Sie einen Bestätigungsblock? – T3rm1

+1

Sie benötigen einen Bestätigungsblock, wenn Sie Tests gemäß ["Arrange Act Assert"] (http://c2.com/cgi/wiki?ArrangeActAssert) oder ["Gegeben wenn dann"] (http: //martinfowler.com/bliki/GivenWhenThen.html) Stil. –

+0

@ Rogério Ich verstehe diese Antwort, aber warum können Sie dann eine Verifizierung in einem Erwartungsblock setzen? zB: 'mal',' minTimes' usw. In welchem ​​Szenario würde man diese Überprüfungen in einem Erwartungsblock verwenden wollen? – PDStat

Verwandte Themen