Ich benutze Mockito, um meinen Kotlin-Code zu testen. Es ist eine Web-App und ich benutze Frühling, um Werte in einige Felder zu injizieren.Kotlin Lazy Block nicht ausgeführt, wenn Mockito und InjectMocks verwenden
Zum Beispiel meiner Klasse Schnipsel sieht wie folgt aus etwas:
class MyComponent {
@Inject private lateinit var request: HttpServletRequest
@Inject private lateinit var database: Database
diesen Test in meiner Einheit zu imitieren verwende ich die @Mock
und @InjectMocks
Anmerkungen von Mockito. So sieht mein Test in etwa so aus:
class MyComponentTest {
@Mock private lateinit var request: HttpServletRequest
@Mock private lateinit var database: Database
@InjectMocks private lateinit var sut: MyComponent
@Before
fun setup() {
MockitoAnnotations.initMocks(this)
}
Was alles funktioniert. Allerdings habe ich auch einen faulen Initialisierungsbaustein in meiner Komponente wie dieses:
val user: User by lazy {
database.findUser()
}
fun getUsername(): String {
return user.name
}
Als mein Testanrufe myComponent.getUsername()
Ich würde erwarten, database.findUser()
genannt werden, da es user
initialisiert, aber dies nicht geschieht.
Wenn ich einen Haltepunkt in den Lazy Block setze, wird er nie getroffen. Nun gehe ich davon aus, dass dies etwas damit zu tun hat, wie Mockito und @InjectMocks
user
berühren müssen, aber ich weiß es nicht wirklich. Wenn ich manuell MyComponent
konstruiere, dann wird der Lazy Block ausgeführt - aber das wird meine Mocks nicht injizieren.
Wie kann ich sicherstellen, dass der Lazy Block von meinem Test korrekt aufgerufen wird?
UPDATE: Nach einer Woche Abwesenheit, versucht, dies ohne Änderungen zu reproduzieren, und ich konnte nicht. Kann es nicht erklären.
Es wäre hilfreich, wenn Sie eine [MCVE] (http://stackoverflow.com/help/mcve) bereitstellen könnten. Wie es jetzt ist, kann ich Ihren Code nicht kopieren und reproduzieren das Problem, das Sie sehen. – mfulton26