So by the time you’re ready to push to staging you should be past the point of wanting to emulate AWS and instead pushing to UAT/test/staging (whatever your naming convention) AWS accounts.
Ideally you would have multiple non-production environments in AWS and if your teams are well staffed then your dedicated Cloud Platform / DevOps team should be locking these non-prod environments from developers in the same way as they do to production too.
Bonus points if you can spin up ephemeral environments automatically for feature branches via CI/CD. But that’s often impractical / not pragmatic for your average cloud-based project.
But you can’t have every dev tweaking staging at the same time as they work. How can you debug things when the ground is shifting beneath you?
Ideally every dev has their own AWS account to play with, but that can be cost prohibitive.
A good middle ground is where 95% of work is done locally using emulators and staging is used for the remaining 5%.
One of the first things I do when building a new component is create a docker compose environment for it.
DIY mocks alone can get you somewhat there, but that relies on the developer having intimate knowledge of the aws sdk under test and it's very easy to mock the inputs and outputs wrong. I'd rather defer that to an emulation layer that does that mimicry better than my guess and check with 30m between attempts when my cloudformation deployments ultimately fail...