Specs2 测试无法在 IntelliJ 中原生运行

Posted

技术标签:

【中文标题】Specs2 测试无法在 IntelliJ 中原生运行【英文标题】:Specs2 Tests Fail to Run Natively in IntelliJ 【发布时间】:2016-08-09 18:50:09 【问题描述】:

在 IntelliJ 中运行 Specs2 失败。通过 SBT 任务手动运行相同的测试工作正常,没有任何问题。

消息:“测试框架意外退出” IntelliJ:v.15.0.5 或 2016.2 EAP(内部版本 #IC-162.426.1) 平台:Scala 2.11.7、SBT 0.13.8、Specs2 2.4.17、Play! 2.3.10

这是一个常见的错误响应,但对于许多其他人来说,根本原因似乎不同。我之前解决过这个问题,并通过将以下内容添加到build.sbt 来纠正它:

fork in Test := false
parallelExecution in Test := false

现在测试又失败了。我查看了我们的 build.sbt 文件的修订历史记录,但我没有发现任何会引发这种回归的重要内容,我也没有任何线索。

在逐步调试崩溃后,我发现了以下根本原因:

java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at org.specs2.reflect.Classes$class.createInstanceFor(Classes.scala:154)
    at org.specs2.reflect.Classes$.createInstanceFor(Classes.scala:207)
    at org.specs2.reflect.Classes$$anonfun$createInstanceOfEither$1.apply(Classes.scala:145)
    at org.specs2.reflect.Classes$$anonfun$createInstanceOfEither$1.apply(Classes.scala:145)
    at scala.Option.map(Option.scala:146)
    at org.specs2.reflect.Classes$class.createInstanceOfEither(Classes.scala:145)
    at org.specs2.reflect.Classes$.createInstanceOfEither(Classes.scala:207)
    at org.specs2.reflect.Classes$class.org$specs2$reflect$Classes$$createInstanceForConstructor(Classes.scala:118)
    at org.specs2.reflect.Classes$$anonfun$4.apply(Classes.scala:98)
    at org.specs2.reflect.Classes$$anonfun$4.apply(Classes.scala:98)
    at scala.collection.immutable.List.map(List.scala:273)
    at org.specs2.reflect.Classes$class.tryToCreateObjectEither(Classes.scala:98)
    at org.specs2.reflect.Classes$.tryToCreateObjectEither(Classes.scala:207)
    at org.specs2.reflect.Classes$class.tryToCreateObject(Classes.scala:70)
    at org.specs2.reflect.Classes$.tryToCreateObject(Classes.scala:207)
    at org.specs2.specification.SpecificationStructure$.createSpecificationFromClassOrObject(BaseSpecification.scala:126)
    at org.specs2.specification.SpecificationStructure$.createSpecificationOption(BaseSpecification.scala:107)
    at org.specs2.specification.SpecificationStructure$.createSpecification(BaseSpecification.scala:95)
    at org.specs2.runner.ClassRunner.createSpecification(ClassRunner.scala:60)
    at org.specs2.runner.ClassRunner.start(ClassRunner.scala:31)
    at org.specs2.runner.NotifierRunner.start(NotifierRunner.scala:25)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.jetbrains.plugins.scala.testingSupport.specs2.JavaSpecs2Runner.runSpecs2_old(JavaSpecs2Runner.java:133)
    at org.jetbrains.plugins.scala.testingSupport.specs2.JavaSpecs2Runner.runSingleTest(JavaSpecs2Runner.java:204)
    at org.jetbrains.plugins.scala.testingSupport.specs2.JavaSpecs2Runner.main(JavaSpecs2Runner.java:85)
Caused by: java.lang.IncompatibleClassChangeError: Found class scalaz.Tree, but interface was expected
    at org.specs2.mutable.SideEffectingCreationPaths$class.$init$(FragmentsBuilder.scala:245)
    at org.specs2.mutable.Specification.<init>(Specification.scala:12)
    at controllers.VerificationApiSpec.<init>(VerificationApiSpec.scala:26)
    ... 32 more

scalaz.Tree 是我项目中许多其他依赖项的传递依赖项,这些依赖项请求版本包括 7.1.17.1.27.1.37.0.6scalaz。有趣的是,7.0.xscalaz.Tree 是一个特征(Java 白话中的接口),但7.1.x 中是一个抽象类,因此这可能构成根本原因。

鉴于传递依赖与 scalaz 7.1.x7.0.x 显然不兼容,是否有可能解决此问题?

【问题讨论】:

【参考方案1】:

Specs2 2.4.17 使用 Scalaz 7.1.0。您构建中的其他一些依赖项可能正在拖动 Scalaz 7.2.x 依赖项。我建议您将您的 specs2 版本更新为 3.8.4,这将带来更新版本的 Scalaz。

【讨论】:

我认为你是对的,我更新了我的问题以反映这一点。我会尝试升级到 3.8.4 但除非有可能解决这样的传递依赖冲突吗? 由于您的项目可以正常使用 sbt,我建议您从 Intellij 中的模块依赖项中删除错误的 jar。

以上是关于Specs2 测试无法在 IntelliJ 中原生运行的主要内容,如果未能解决你的问题,请参考以下文章

如何将 IntelliJ 与 Play Framework 和 Scala 一起使用

使用 Slick、specs2 和 Postgresql 进行 2.4 测试

Play 2.4.0 功能测试中的 Specs2/Guice 问题

Play2/Specs2 中的 Slick/Postgres 数据库测试问题

使用 scala play specs2 针对测试 mysql 数据库的演变

Windows 11 中原生支持新的视频编码的 API