Hi Andy,
We use component at SMX, and do follow an approach similar to the one you hint at but as Stuart suggests we tend to have protocols that are more application-centric.
For instance, we use Cassandra extensively and our general interaction with that is captured by the protocol:
(defprotocol Connection
(bind [this stmt vals] "bind values to a prepared statement")
(prepare [this query] "provide a prepared statement from a query")
(execute [this stmt] [this stmt opts] "execute a query or statement")
(execute-batch [this stmts] [this stmts opts] "execute a batch of statements")
That isn't an attempt to create an abstraction of Cassandra, it captures one way in which a number of our applications use Cassandra.
In certain test cases that allows us to use a stub-component which returns canned responses, in other cases we integrate with a test Cassandra cluster, both have merits.
One further advantage is this protocol would allow us to swap the underlying implementation (which is currently based on Alia -
https://github.com/mpenet/alia) with something else if we ever wanted to without impacting consumers of that protocol. That wasn't the driver for it though, stubbed tests was.