// USING COMPANION OBJECT FOR DEPENDENCY INJECTION interface SomeComponent { fun foo(): String } class SomeComponentImpl : SomeComponent { override fun foo() = "foo" } abstract class SomeModule { val _someComponentSingleton = SomeComponentImpl() val _someComponentNonSingleton = SomeComponentImpl::class.java } // "injected" unless overridden class SomeService(val someComponentSingleton: SomeComponent = _someComponentSingleton, val someComponentNonSingleton: SomeComponent = _someComponentNonSingleton.newInstance()) { companion object : SomeModule() } class SomeServiceTest { @Test fun singleton() { val bean1 = SomeService() val bean2 = SomeService() assertSame(bean1.someComponentSingleton, bean2.someComponentSingleton) assertNotSame(bean1.someComponentNonSingleton, bean2.someComponentNonSingleton) } }