Я новичок в Guice. Я пытаюсь использовать requestInjection, чтобы таким образом внедрить зависимости синглтона kotlin object .
ПОДХОД 1 :
class SampleTest {
@Test
fun test() {
Guice.createInjector(object: KotlinModule() {
override fun configure() {
requestInjection(A)
}
})
assertEquals("Hello world", A.saySomething())
}
}
object A {
@Inject
private lateinit var b: B
fun saySomething(): String {
return b.sayHello()
}
}
class B {
fun sayHello(): String {
return "Hello world"
}
}
Но я получаю эту ошибку:
kotlin.UninitializedPropertyAccessException: lateinit property b has not been initialized
Если я заменил A на класс без конструктора arg, это сработает.
ПОДХОД 2 :
class SampleTest {
@Test
fun test() {
val a = A()
Guice.createInjector(object: KotlinModule() {
override fun configure() {
requestInjection(a)
}
})
assertEquals("Hello world", a.saySomething())
}
}
class A {
@Inject
private lateinit var b: B
fun saySomething(): String {
return b.sayHello()
}
}
class B {
fun sayHello(): String {
return "Hello world"
}
}
Вместо этого, если я изменю requestInjection на requestStaticInjection , это также будет работать.
ПОДХОД 3 :
class SampleTest {
@Test
fun test() {
Guice.createInjector(object: KotlinModule() {
override fun configure() {
requestStaticInjection<A>()
}
})
assertEquals("Hello world", A.saySomething())
}
}
object A {
@Inject
private lateinit var b: B
fun saySomething(): String {
return b.sayHello()
}
}
class B {
fun sayHello(): String {
return "Hello world"
}
}
Почему ПОДХОД 1 не работал? Почему APPROACH 2 и APPROACH 3 работают?