We made code coverage a part of CI, and we've been using that to drive up code coverage. It's been working. Our tests have gone from ~25% to ~50% coverage. Breakages making it out to staging have gone down.
Also, some incentives are well aligned with this. If people see that things aren't easy to test, then they get rearranged to make them easy to test. Not all incentives are aligned, but not everything is perfect. This is why reviews are useful.
When I've looked at the reports I keep finding trivial code that would be hard to test for little gain.
If your trivial code is also hard to test, then this indicates architectural code debt. Why isn't the trivial code trivial to test?