В случае с DI вы во-первых четко знаете, что нужно этому классу для нормальной работы, тогда как синглтон вносит ложь в api, т.е. вам придется прочитать весь код класса, что бы понять что ему нужно... а ведь в Синглтонах могут быть вызовы других синглтонов... жуть.
Во-вторых, вы легко и непринужденно подсовываете какие угодно моки при тестировании этого класса.
В-третьих, Синглтон глобален, что нарушает принцип, что объект может работать только с теми объектами, с которыми ему нужно работать, и не может влиять на другие никак. Так как Синглтон глобален - это легко нарушить. Это опять же усложняет тестирование.