Asserting an event was dispatched, not that a mail was sent

Testing the effect couples the test to the listener, and testing the event tests the thing the code under test is actually responsible for.

// couples this test to whatever the listeners do
Mail::assertSent(OrderShipped::class);
Notification::assertSentTo($user, ShippedNotification::class);

// tests what the service decided
Event::fake([OrderWasShipped::class]);
$this->service->ship($order);
Event::assertDispatched(OrderWasShipped::class,
    fn ($e) => $e->order->is($order));

The listener gets its own test, which is a smaller and more focused one — and adding a second listener then breaks no existing test. Event::fake with an explicit list rather than faking everything is the detail that matters, because faking all events silently disables anything else the code depends on.