Start here. This is the direct spoken answer to practice first.
Why this question matters
Background processing fails across time and process boundaries. Useful tests need to prove the durable outcome, not merely that a handler method returned without throwing.
I would unit-test the handler's business decisions, then add integration tests around durable state and delivery behavior. The main cases are successful processing, the same message delivered twice, a transient failure followed by retry, a permanent invalid message, and cancellation during shutdown. Assertions would verify the business result and the stored processing state so duplicate delivery cannot create a second charge, record, or notification. Time, identifiers, and retry delays would be controllable rather than based on wall-clock sleeps.