Use whatever fits your need. I doubt there is a generic
answer to this question. If it is clear, explicit, readable
and understandable then it is "idiomatic" no matter what
technique/pattern you use.
Personally I dislike creating an interface just to allow testing
and prefer global functions: I'm thinking of the test as a
bit "secondary" and if the "real" code has only one
implementation of an interface this feels strange. An interface
signals: "Supply whatever implementation fits your need!"
But if there ever is just one "real" implementation this type
of announcement is not clear, explicit or especially
understandable. (Don't get me wrong, I think writing testable
code is important, but clear, understandable code is more
important.)
V.