我有一个测试套件,它使用Slick进行数据库访问.此套件中的某些测试访问数据库而某些测试不访问.我的套房有
implicit val db = DB.getDB
它DataBaseDef在套件执行开始时有效地初始化.然后,此值将用作某些方法的隐式参数值.它还具有在套件执行结束时afterAll()关闭的功能db:
override def afterAll():Unit={
    db.close()
    super.afterAll()
  }
Run Code Online (Sandbox Code Playgroud)
现在,如果我改为:
 implicit lazy val db = DB.getDB
那究竟会发生什么?
如果我只运行一个不使用DB的测试,那么连接将不会被初始化,并且afterAll()它仍会尝试关闭连接,在这种情况下我有问题,对吧?我试图运行,但没有发生错误,没有抛出异常......
我对implicits的了解不足以帮助我理解它与懒惰相结合.
那究竟会发生什么?
在第一次访问该值之前,不会初始化该值.
它仍然会尝试关闭连接,在这种情况下我有问题,对吗?
当您访问时db.close(),它将首先初始化该值,这意味着它将DB.getDb在关闭连接之前调用.这意味着,虽然您不打算这样做,但连接仍然会被初始化然后立即关闭,因此您不会看到异常.