🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano
MockClock — Mock-Uhr mit virtuellem Schlaf
Zweck
Wie FrozenClock, implementiert aber zusätzlich SleepableClockInterface: sleep() verschiebt die virtuelle Zeit sofort, ohne den Prozess zu blockieren.
Wofür und wie einzusetzen
Testen von Retry/Backoff, Polling und Timeouts in Millisekunden: Der Code „schläft", die Uhr rückt vor, der Test wartet nie.
Beispiel
$clock = MockClock::from('2026-01-01 00:00:00', 'UTC');
$retry = new RetryPolicy($clock); // the code under test calls sleep()
$retry->run(); // instant: the sleep is virtual
$clock->sleepUntil(new DateTimeImmutable('2026-01-01 00:05:00'));
Anti-Patterns
Mischen Sie sie nicht mit echten Verzögerungen (usleep) in einem Szenario — die Zeitachsen laufen auseinander.
Lebenszyklus
sequenceDiagram
participant T as Test
participant C as MockClock
participant S as Service
T->>C: from('2026-01-01')
T->>S: run()
S->>C: sleep(30)
C-->>S: instantly (+30s virtual)
S->>C: now()
C-->>S: 00:00:30
Funktionsvergleich mit Konkurrenten
| Aspekt | 🏆 CloudCastle | symfony | carbon | lcobucci | beste | ergebnis |
|---|---|---|---|---|---|---|
Virtuelles sleep() ohne Blockierung | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
sleepUntil() bis zu einem Zeitpunkt | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
Rückwärtsverschiebungen (rewind) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Isolation ohne globalen Zustand | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ |
| Gesamt | 🏆 4 | 2 | 0 | 1 | 1 | 1 |
🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano