Инъекция экземпляра не работает с Kotlin & Guice

У меня есть следующий код:

class Test { private val context = Context().apply { property = "foo" } private val injector = Guice.createInjector(Module { it.bind(Context::class.java).toInstance(context) }) @Test fun `service received correct context`() { assertThat(injector.getInstance(Service::class.java).context.property, equalTo("foo")) } } class Service @Inject constructor(val context: Context) class Context { @Inject lateinit var property: String } 

При запуске теста тест терпит неудачу, жалуясь (по праву), что пустая строка не является «foo». Но почему Guice не использует экземпляр, который я тщательно создавал и поставлял в инжектор в форме Module ? (Это первый вопрос.)

Однако, если я изменил Context чтобы выглядеть так:

 class Context { @get:Inject lateinit var property: String } 

тест неожиданно преуспевает. Я не совсем понимаю, почему Guice вообще рассматривает аннотации Context если я связал класс Context с экземпляром, который я создал. Может ли кто-нибудь сказать мне, что здесь происходит?

    Guice автоматически вводит экземпляры, переданные toInstance() в инструкции bind, поэтому @Inject аннотации в Context являются релевантными.

    В вашем примере Guice не создает новый экземпляр Context , а вводит поле экземпляра пустой строкой.

    Когда вы комментируете свойство, Котлин помещает аннотацию на поле. Когда вы комментируете геттер, Гиш игнорирует его.