2013-05-20 9 views
5

Chcę przetestować, że niektóre metody zostaną odwołane w przypadku niepowodzenia. Wywołanie wykonywane w oddzielnym wątku. Tak więc piszę taki kod:Używanie easymock w wielowątkowości

final Foo mock = createStrictMock(Foo.class); 

mock.bar(); 
expectLastCall().andThrow(new RuntimeException("TEST EXCEPTION")); 
mock.bar(); 
replay(mock); 

doStuff(); 
sleepSomeTime(); //Pretty dirty. But I need to test it in multithreading. 
verify(mock); 

Test zostanie zaliczony. Ale nie wdrożyłem jeszcze odwołania.

zrobić test nie powiedzie, Wymieniłem

mock.bar(); 
expectLastCall().andThrow(new RuntimeException("TEST EXCEPTION")); 

z

mock.bar(); 
expectLastCall().andAnswer(new IAnswer<Void>() { 
     @Override 
     public Void answer() throws Throwable { 
      sleepSomeTime(); 
      throw new RuntimeException("TEST EXCEPTION"); 
     } 
    }); 

Ale nie podoba mi się dodanie sleepSomeTime wokół moich testów. Poza tym, tak naprawdę nie rozumiem, gdy pomaga w tym konkretnym przypadku. Tak,

Dlaczego dodawanie opóźnienia pomogło?

Jaki jest właściwy sposób na takie rzeczy?

Odpowiedz

5

Moje podejście polegało na użyciu zamków. Nie ma dość wystarczająco informacji w poście pokazać coś ostateczne, ale byłoby to prawdopodobnie wyglądać następująco:

final Lock lock = new Lock(); 
lock.lock(); 
expectLastCall().andAnswer(new IAnswer<Void>() { 
    @Override public Void answer() throws Throwable { 
     lock.unlock(); 
     throw new RuntimeException("TEST EXCEPTION"); 
    } 
});  
doStuff(); 
lock.lock(); 
verify(mock); 

Istotą jest tu drugi zamek() wywołanie jest zablokowany aż do odblokowania w swojej makiety zwalnia zamek.

+1

To najlepsza odpowiedź. Uważam jednak, że należy to zrobić bez zamków. –

+0

W zależności od kodu, możesz przechwycić wywołania zwrotne, więc metody weryfikacji są wykonywane w wywołaniu zwrotnym, które łaskocze w ostatniej linii próbnej. –

-1

Czy próbowałeś zaimplementować używając pracowników swingowych?

Możesz także spróbować, jeśli czekasz, możesz spróbować użyć notify lub użyć klasy synchronized.

0

Nie ma prostego sposobu na wykonanie testu jednostkowego w kontekście wielowątkowym.

Ale proponuję, aby przeczytać ten answer to another similar question. Kod DRTestUtils zapewnia kilka wygodnych metod do ukrywania się za przyjemniejszym sposobem wywołania metody.

Powiązane problemy