In many production systems you'll want to have one module capable of talking to many potential implementations of a collaborator module (e.g a in memory cache, a redis-based cache etc). While testing it's useful to control which module the module under test is talking to.

Here are the approaches I can see. The two points that seem to divide the approaches are their tool-ability (dialyzer) and their ability to handle stateful implementations (which need a pid).

Passing modules

Modules are first class, so you can pass them in. Used in EEx, where passed module must implement a behaviour.

Currently, there is an explosion of tools that aim to manage secrets for automated, cloud native
infrastructure management. Daniel Somerfield did some work classifying the various approaches,
but (as far as I know) no one has made a recent effort to summarize the various tools.

This is an attempt to give a quick overview of what can be found out there. The list is alphabetical.
There will be tools that are missing, and some of the facts might be wrong--I welcome your corrections.
For the purpose, I can be reached via @maxvt on Twitter, or just leave me a comment here.