@natpryce In order to keep the entire thing unit testable, I'd tend towards abstracting the entire of the core app into a unit and then just treating the http/executor/queue consumer services as clients of it's business API. Stick that API behind one or more interfaces (based on role) and then you've got a way to test each "input" layer in isolation. The application itself would instantiate and control all consumer/thread pool/server services in its start/stop/close because they're all at the same abstraction layer.