如何使用SBT对胖罐子运行ScalaTest测试?

如何使用SBT对胖罐子运行ScalaTest测试?,scala,sbt,scalatest,sbt-assembly,Scala,Sbt,Scalatest,Sbt Assembly,我有一个简单的SBT项目,由src/main/Scala中的一些Scala代码和src/test/Scala中的一些测试代码组成。我使用sbt assembly插件创建一个胖jar,用于部署到远程系统上。fat jar包含Scala项目的所有依赖项,包括Scala运行时本身。这一切都很好 现在我正试图找到一种方法,可以对胖罐子运行Scala测试。我尝试了一个显而易见的方法,创建了一个新的配置,扩展了Testconfig并将dependencyClasspath修改为胖JAR而不是默认值,但是这失

我有一个简单的SBT项目,由
src/main/Scala
中的一些Scala代码和
src/test/Scala
中的一些测试代码组成。我使用
sbt assembly
插件创建一个胖jar,用于部署到远程系统上。fat jar包含Scala项目的所有依赖项,包括Scala运行时本身。这一切都很好

现在我正试图找到一种方法,可以对胖罐子运行Scala测试。我尝试了一个显而易见的方法,创建了一个新的配置,扩展了
Test
config并将
dependencyClasspath
修改为胖JAR而不是默认值,但是这失败了,因为(我假设是因为)胖JAR中包含了Scala运行时,并且与已经加载的Scala运行时发生了某种冲突

我的解决方案现在是可行的,但它有严重的缺点。我只是使用
Fork.java
org.scalatest.tools.Runner
运行程序上调用java,并将类路径设置为包含测试代码和fat jar以及所有测试依赖项。缺点是SBT测试的丰富性都不起作用,没有
testQuick
,没有
testOnly
,并且测试失败报告在stdout上

我的问题归结为:当这些测试不依赖于相应的SBT
compile
输出,而是依赖于一个本身包含所有Scala运行时的胖JAR文件时,如何使用SBT的测试命令来运行这些测试?

这就是我的目的(对于specs2,但可以调整)。这基本上就是你说的叉子解决方案,但我想我会把它留在这里,以防有人想知道它可能是什么。不幸的是,我认为你不能作为SBT测试运行者“正式”运行此测试。我还应该补充一点,即使这是Scala,您仍然需要Fork.java,因为Fork.Scala依赖于我似乎没有的runner类

test.sbt(或者build.sbt,如果你想把一堆东西放在那里-如果你想组织,sbt会读取根目录中的所有.sbt文件):

build.sbt中的更改:

lazy val root = (project in file("."))
  .settings(/* your original settings are here */)
  .settings(inConfig(Test)(baseAssemblySettings): _*) // enable assembling in test

您想在创建uber jar之前运行测试吗?@YuvalItzchakov否在创建jar之前,测试已经通过了。此测试运行的目的是验证它们在针对胖jar运行时是否仍然通过。这听起来可能有些多余,但这个胖罐子将由优化器进行后期处理,我需要验证优化器没有破坏任何东西
lazy val root = (project in file("."))
  .settings(/* your original settings are here */)
  .settings(inConfig(Test)(baseAssemblySettings): _*) // enable assembling in test