首页 > 解决方案 > SBT 在完成测试时断开数据库客户端

问题描述

我正在尝试从 sbt 任务执行主项目中的代码:

lazy val disconnectClients = taskKey[Unit]("Disconnect postgres clients after tests.")

disconnectClients := {
  (testLoader in Test).value
    .loadClass("com.companyname.DBDisconnector")
    .getMethod("close")
    .invoke(null).asInstanceOf[Unit]
}

DBDisconnector在哪里:

class DBDisconnector {
  ...
  def close(): Unit = {
    println("-------> DISCONNECT <--------")
    ds.close()
  }
}

但什么也没发生..我做错了什么?谢谢!

标签: scalasbt

解决方案


将实例化对象传递给invoke而不是null像这样

lazy val disconnectClients = taskKey[Unit]("Disconnect postgres clients after tests.")
disconnectClients := {
  val loader = (testLoader in Test).value
  val cls = loader.loadClass("example.DBDisconnector")
  val disconnector = cls.newInstance()
  cls.getMethod("close").invoke(disconnector)
}

Tests.Cleanup是实现类似清理的另一种方法:

testOptions in Test += Tests.Cleanup { loader =>
  val cls = loader.loadClass("example.DBDisconnector")
  val disconnector = cls.newInstance()
  cls.getMethod("close").invoke(disconnector)
}

推荐阅读