package main import ( "sync" "testing" "time" ) type Actor interface { Perform() } func Cinema(a Actor) { go a.Perform() } type mockActor struct{ wg *sync.WaitGroup } func (m mockActor) Perform() { m.wg.Done() } func TestCinema(t *testing.T) { var wg sync.WaitGroup wg.Add(1) Cinema(mockActor{wg: &wg}) done := make(chan struct{}) go func() { defer close(done) wg.Wait() }() select { case <-done: case <-time.After(500 * time.Millisecond): t.Fatalf("timeout: Perform did not finish in 500 ms") } }