2012-12-17 17 views
17

Używam EasyMock do wykonywania niektórych testów jednostkowych i nie rozumiem użycia EasyMock.expectLastCall(). Jak widać w poniższym kodzie, mam obiekt z metodą zwracającą void, który zostanie wywołany w innej metodzie obiektu. Myślę, że muszę sprawić, żeby EasyMock oczekiwał tego wywołania metody, ale próbowałem skomentować wywołanie expectLastCall() i nadal działa. Czy to dlatego, że zdałem EasyMock.anyObject()), że zarejestrował to jako oczekiwane połączenie lub czy dzieje się coś innego?Oczekiwania EasyMock metodami pustymi

MyObject obj = EasyMock.createMock(MyObject.class); 
MySomething something = EasyMock.createMock(MySomething.class); 
EasyMock.expect(obj.methodThatReturnsSomething()).andReturn(something); 

obj.methodThatReturnsVoid(EasyMock.<String>anyObject()); 

// whether I comment this out or not, it works 
EasyMock.expectLastCall(); 

EasyMock.replay(obj); 

// This method calls the obj.methodThatReturnsVoid() 
someOtherObject.method(obj); 

Doc API dla EasyMock mówi to o expectLastCall():

Returns the expectation setter for the last expected invocation in the current thread. This method is used for expected invocations on void methods. 
+0

To pytanie było nie to, czego szukał, ale w połączeniu z odpowiedzią i komentarze z Yogendra pomógł mi zrozumieć mój problem. Dzięki, że przyjechałeś tutaj pierwszy. – DaShaun

Odpowiedz

23

Ta metoda zwraca ci uchwyt oczekiwaniem przez IExpectationSetters; co daje ci możliwość sprawdzenia (potwierdzenia), że twoja nieważna metoda została wywołana, a także powiązane zachowania, np.

EasyMock.expectLastCall().once(); 
EasyMock.expectLastCall().atLeastOnce(); 
EasyMock.expectLastCall().anyTimes(); 

Szczegółowe API zestawu IExpectationSetters to here.

W twoim przykładzie właśnie dostaniesz uchwyt i nic z nim nie robisz dlatego nie widać żadnego wpływu posiadania lub usuwania instrukcji. Jest to bardzo podobne do wywołania metody gettera lub zadeklarowania jakiejś zmiennej i nie należy jej używać.

+0

Co mam zrobić (lub co robię), który sprawia, że ​​mój test oczekuje wywołania metody 'methodThatReturnsVoid()'? Po prostu nazywając to przed 'replay()'? –

+0

@SotiriosDelimanolis Jak już wspomniałem, użyj 'EasyMock.expectLastCall(). AtLeastOnce();' aby potwierdzić, że twoja metoda została pomyślnie wywołana co najmniej raz. –

+0

Rozumiem. Ale jeśli nie mam 'expectLastCall()', test nadal mija. Czy nie powinno się to nie udać, skoro nie sprawiłeś, że pozorny obiekt tego oczekuje? –

2

Wystarczy EasyMock.expectLastCall(); gdy trzeba dodatkowo zweryfikować coś innego niż „że metoda została wywołana. (Taki sam, jak ustawienie oczekiwania)”

że chcesz sprawdzić, ile razy metoda nazwano tak będziesz dodać którykolwiek:

EasyMock.expectLastCall().once(); 
EasyMock.expectLastCall().atLeastOnce(); 
EasyMock.expectLastCall().anyTimes(); 

Albo że chcesz rzucić wyjątek

EasyMock.expectLastCall().andThrow() 

Jeśli nie obchodzi się wtedy EasyMock.expectLastCall(); niewymagane i nie ma znaczenia, twoje oświadczenie "obj.methodThatReturnsVoid(EasyMock.<String>anyObject());" wystarczy do ustalenia oczekiwań.

0

Brakuje EasyMock.verify (..)

MyObject obj = EasyMock.createMock(MyObject.class); 
MySomething something = EasyMock.createMock(MySomething.class); 
EasyMock.expect(obj.methodThatReturnsSomething()).andReturn(something); 

obj.methodThatReturnsVoid(EasyMock.<String>anyObject()); 

// whether I comment this out or not, it works 
EasyMock.expectLastCall(); 

EasyMock.replay(obj); 

// This method calls the obj.methodThatReturnsVoid() 
someOtherObject.method(obj); 

// verify that your method was called 
EasyMock.verify(obj); 
+0

Nie, "verify" było dorozumiane.Problem wyjaśniono w [Odpowiedź Yogendry] (http://stackoverflow.com/a/13917432/438154). Nie napisałem poprawnie swoich fałszywych oczekiwań. –