Ich habe eine Testsuite, die Slick für DB-Zugriff verwendet. Einige Tests in dieser Suite greifen auf die DB zu, andere nicht. Meine Suite hatKann der implizite Wert auch ein Lazy-Wert sein, wenn er als impliziter Methodenparameterwert verwendet wird?
implicit val db = DB.getDB
die effektiv DataBaseDef
am Anfang der Suite Ausführung initialisiert. Dieser Wert wird dann als impliziter Parameterwert für einige Methoden verwendet. Auch sie hat die afterAll()
die die db
am Ende der Suite Ausführung schließt:
override def afterAll():Unit={
db.close()
super.afterAll()
}
Wenn ich nun geändert: implicit lazy val db = DB.getDB
dann, was genau passieren wird?
Wenn ich nur einen Test ausführen, der nicht die DB verwendet dann wird die Verbindung nicht initialisiert und in der afterAll()
wird es immer noch versuchen, die Verbindung zu schließen, und ich habe ein Problem in diesem Fall, oder? Ich versuchte zu laufen, aber kein Fehler ist passiert und keine Ausnahme wurde geworfen ...
Mein Wissen über implicits ist nicht genug, um mir zu helfen, es in Kombination mit faul zu verstehen.
Sie haben Recht. Ich dachte mehr nach dem Posten der Frage und das wurde mir klar. Noch möchte ich den Effekt von "Lazy" Modifikator auf impliziten Parameter Wert Entdeckung in Methoden Aufruf verdeutlichen. Könntest du damit helfen? –
oder ich kann sicher die Standardregel annehmen: wenn nichts darüber in den Spezifikationen als faul gesagt wird, hat keine Wirkung in dieser Hinsicht? –
@AlexanderArendar Wenn Sie ein implizites Lazy-Val haben, das von einer aufgerufenen Methode benötigt wird, wird der Wert materialisiert. In diesem Fall wird die DB Verbindung hergestellt. –