scala - 更改 build.sbt 以使 ScalaTest 测试能够与 Scala Play 一起运行

标签 scala playframework scalatest intellij-13

我正在关注文档 here ,这似乎根本不起作用;但我什至不确定我在这里做错了什么。

首先,只需在 project/Build.scala 中添加给定的片段文件导致编译错误;所以这是没有开始的。
将其包裹在一个扩展 Build 的对象中(如在 SBT 示例中)不会导致编译错误,但不会运行测试。

最终,我在 build.sbt 中添加了以下内容

libraryDependencies ++= Seq(
    "org.scalatestplus" %% "play" % "1.0.0" % "test",
    ...

这稍微好一点,但在 IntelliJ 中,我的 ApplicationSpec有各种编译错误:
import org.scalatestplus.play._

import scala.collection.mutable.Stack

class ApplicationSpec extends PlaySpec {

  "A Stack" must {
    "pop values in last-in-first-out order" in {
      val stack = new Stack[Int]
      stack.push(1)
      stack.push(2)
      stack.pop() mustBe 2
      stack.pop() mustBe 1
    }
    "throw NoSuchElementException if an empty stack is popped" in {
      val emptyStack = new Stack[Int]
      a [NoSuchElementException] must be thrownBy {
        emptyStack.pop()
      }
    }
  }
}
must , mustBea不被认可。
最后,如果我尝试运行 activator test我得到:
sentinel/test:definedTests
java.lang.NoSuchMethodError: org.specs2.runner.Fingerprints$.fp1()Lorg/specs2/runner/SpecificationFingerprint;
    at org.specs2.runner.Specs2Framework.fingerprints(SbtRunner.scala:23)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at sbt.TestFramework$.getFingerprints(TestFramework.scala:113)
    at sbt.Tests$$anonfun$discover$1.apply(Tests.scala:242)
    at sbt.Tests$$anonfun$discover$1.apply(Tests.scala:242)
    at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:251)
    at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:251)
    at scala.collection.immutable.List.foreach(List.scala:318)
    at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:251)
    at scala.collection.AbstractTraversable.flatMap(Traversable.scala:105)
    at sbt.Tests$.discover(Tests.scala:242)
    at sbt.Defaults$$anonfun$detectTests$1.apply(Defaults.scala:556)
    ...
[error] (sentinel/test:definedTests) java.lang.reflect.InvocationTargetException

从本质上讲,这是一个史诗般的失败——如果文档能更具体地说明所有机器工作的要求和预期,那就太好了:就目前情况而言,解决困惑局面有点困难。

今天我一直在谷歌上搜索并查看堆栈溢出几个小时,查看 ScalaTestPlus 文档(好吧,它的整个两段......)并尝试了许多变体,但都无济于事。

full project's code is on github .

值得注意的是,如果我屈服于“不良文档的力量”并使用 Specs2,那么测试将正确运行(至少从 Intellij 内部,就“hello world”示例而言)。

我仍然更喜欢使用 ScalaTest(真的不明白为什么我需要学习两个测试框架,真的) - 所以,任何帮助将不胜感激。

最佳答案

最后,结果证明确实是库版本不匹配,但这是我没有预料到的。

它围绕这样一个事实,即我的 sbt 构建中有一个子项目,它运行良好,但导入了 ScalaTest 2.2.1,而我使用 2.1.7 使其与 ScalaTest+ 1.1.0 一起使用 - 但是,使用仅用于“顶级”项目的 ScalaTest 2.1.7(确实适用于 ST+ 1.1.0)导致了抽象类等的怪异。

Versions, Versions, Versions页面现在已由 Bill 更新,修复方法是使用 ScalaTest 2.2.1、ScalaTestPlus 1.2.0 和 Play 2.3.0 - 它们一起玩得很好。

更新 - 以上仍然通过 sbt/activator test 导致测试失败,我只能通过 IntelliJ 运行测试:修复是更新 build.sbt 以使用 Scala 2.11

最后,为了完成这项工作,这就是我的 build.sbt 中的内容。 :

name := "sentinel"

version := "0.2-SNAPSHOT"

organization := "AlertAvert.com"

scalacOptions ++= Seq("-deprecation", "-feature", "-language:postfixOps")

// The REST project depends on Core Sentinel classes
lazy val sentinel_core = project

lazy val sentinel = (project in file("."))
    .enablePlugins(PlayScala)
    .aggregate(sentinel_core)
    .dependsOn(sentinel_core)

scalaVersion := "2.11.1"

libraryDependencies ++= Seq(
  "org.scalatest" %% "scalatest" % "2.2.1" % "test",
  "org.scalatestplus" %% "play" % "1.2.0" % "test",
  cache
)

(我正在完整地复制它,所以如果其他人有同样的问题,他们会看到它 - 当人们只粘贴一个片段而省略了一些关键要素时,这让我很生气:)

主要归功于 Bill Venners 的帮助和指导。

关于scala - 更改 build.sbt 以使 ScalaTest 测试能够与 Scala Play 一起运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26113181/

相关文章:

scala - NotNull tr​​ait 在 2.8 中是如何工作的,有没有人实际使用过它?

scala - 无法启动 spark-shell,因为它会在 hadoop 集群配置上产生错误,但是,在没有 hadoop 集群的情况下工作正常

Scala 按分隔符拆分序列或列表

scala - 我将如何对内部随机排列数组的方法进行单元测试

scala - 是否有使用 Scala+PlaySpec+Mockito 的每次测试非特定模拟重置模式?

scala - 为什么以下 Scala 代码会抛出 NullPointerException?

java - 了解非阻塞 Web 服务调用与非阻塞 JDBC 之间的区别

scala - 供应异常 : Classes must have either one (and only one) constructor annotated with @Inject or a zero-argument

java - 为什么这个 URL 没有从 Play 打开!框架 1.2.4?

java - Scala 的 BDD 工具支持可重用的参数化 Gherkin 子句