Uważam, dlaczego starasz się przetestować Thread.Sleep. Wygląda na to, że próbujesz przetestować zachowanie w wyniku jakiegoś zdarzenia.
tj.co się stanie, jeśli:
- limit czasu połączenia
- połączenie spadła
Jeśli model kodu w oparciu o zdarzenia, to możesz sprawdzić, co powinno się zdarzyć powinny szczególne wydarzenie nastąpiło zamiast wymyślić konstrukt, który maskuje równoczesne wywołania API. Inaczej, co naprawdę testujesz? Czy testujesz, w jaki sposób twoja aplikacja reaguje na różne bodźce lub po prostu sprawdza, czy JVM działa poprawnie?
Zgadzam się z innymi czytelnikami, że czasami przydatne jest umieszczenie abstrakcji wokół dowolnego kodu czasowego lub wątku związanego np. Z zegarem wirtualnym http://c2.com/cgi/wiki?VirtualClock, aby można było wyłudzić zachowanie czasowe/równoczesne i skoncentrować się na zachowaniu samej jednostki.
Wygląda również na to, że powinieneś przyjąć wzorzec stanu, aby obiekt zachowywał się specyficznie w zależności od stanu, w jakim się znajduje. Np. OczekiwanieConnectionState, ConnectionDroppedState. Przejście do różnych stanów odbywałoby się za pośrednictwem różnych zdarzeń, np. Przekroczenia limitu czasu, zerwania połączenia itp. Nie jestem pewien, czy to przesada dla twoich potrzeb, ale z pewnością usuwa wiele logicznych warunków, które mogą sprawić, że kod będzie bardziej skomplikowany i niejasny.
Jeśli podchodzisz w ten sposób, możesz nadal testować zachowanie na poziomie jednostki, nadal testując na miejscu z późniejszym testem integracyjnym lub testem akceptacyjnym.
to może być postrzegane jako casestudy do testowania jednostkowego z kpiną – dfa
Nie używaj Thread.sleep(), użyj metody wait(). Thread.sleep() używa cykli procesora, natomiast wait() nie. – dhiller