Scala SBT清理挂钩试验

Scala SBT清理挂钩试验,scala,sbt,Scala,Sbt,SBT有一个很好的钩子,允许您在运行所有测试后执行任意代码: testOptions in Test += Tests.Cleanup( () => println("Cleanup")) 这很有效。 我的问题是:我想做一些实际的清理(例如停止一些服务),但是我不能导入我在同一个构建文件中声明的任何依赖项。有没有办法做到这一点?我想我需要把这些放在sbt类路径上,但是我似乎在文档中找不到 另外,我可能在错误的位置执行此操作,是否有更好的地方在所有测试运行后关闭?您不能使用在project

SBT有一个很好的钩子,允许您在运行所有测试后执行任意代码:

testOptions in Test += Tests.Cleanup( () => println("Cleanup"))
这很有效。 我的问题是:我想做一些实际的清理(例如停止一些服务),但是我不能导入我在同一个构建文件中声明的任何依赖项。有没有办法做到这一点?我想我需要把这些放在sbt类路径上,但是我似乎在文档中找不到


另外,我可能在错误的位置执行此操作,是否有更好的地方在所有测试运行后关闭?

您不能使用在project中添加了libraryDependencies的类(您可以在project/project中添加libraryDependencies,但我不建议在两个位置添加)。相反,您可以调用项目源中的清理方法,该方法可以访问已声明的库依赖项。

补充venechka的回答:我正在使用Specs2运行集成测试,在specs中,无法知道所有测试何时运行。因此,我几乎按照venechka和您自己已经指出的方式解决了这个问题,从项目中加载一个类,在初始化时进行清理:


testOptions in IntegrationTest += Tests.Cleanup( (loader: java.lang.ClassLoader) => {
  loader.loadClass("com.mypackage.IntegrationTestCleanup").newInstance
} )

如果你碰巧在使用ScalaTest,我知道在你的测试类中有一个前后的
特性。从这里开始,您只需重写
afterAll
方法来执行清理。这是可行的,我只是想知道如何利用钩子
afterAll
在每个“spec”(在每个测试类之后)之后运行,我很确定。。。它可能适合您的需要,但它可能意味着您的“清理”例程在测试套件的每次执行过程中运行多次(因此可能会稍微减慢速度)。