A test that dispatched a job and then asserted on the database is testing two things and failing for two reasons.
// the dispatching side
Queue::fake();
$this->service->place($order);
Queue::assertPushed(SendConfirmation::class, function ($job) use ($order) {
return $job->orderId === $order->id;
});
// the handling side, separately
(new SendConfirmation($order->id))->handle($mailer);
Splitting at the queue boundary is the same principle as splitting at any other boundary: one test asserts that the right message was sent, the other that the message is handled correctly. The combined version fails when either side changes and the failure message names neither, which is the practical reason to bother.