Search code examples
scalaintellij-ideasbtspecs2

Specs2 Tests Fail to Run Natively in IntelliJ


Running Specs2 in IntelliJ fails. Running the same tests manually via an SBT task works just fine without any problems.

  • Message: "Test framework quit unexpectedly"
  • IntelliJ: v.15.0.5 or 2016.2 EAP (build #IC-162.426.1)
  • Platform: Scala 2.11.7, SBT 0.13.8, Specs2 2.4.17, Play! 2.3.10

This is a common error response, but it looks like the root cause is different for a lot of other people. I have troubleshoot this issue before and corrected it by adding the following to build.sbt:

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

Now the tests are failing again. I have looked through the revision history of our build.sbt file but I do not notice anything significant that would instigate such a regression and I have no clues.

Upon step-debugging the crash I have found the following root cause:

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 is a transitive dependency of many other dependencies in my project that request versions including 7.1.1, 7.1.2, 7.1.3, 7.0.6 of scalaz. It's interesting to note that in 7.0.x scalaz.Tree is a trait (interface in Java vernacular) but an abstract class in 7.1.x, so this may constitute the root cause.

Is it possible to resolve this issue given the transitive dependency conflicts with scalaz 7.1.x and 7.0.x which are evidentially incompatible?


Solution

  • Specs2 2.4.17 uses Scalaz 7.1.0. Some other dependency in your build is probably dragging a Scalaz 7.2.x dependency. I suggest that you update your specs2 version to 3.8.4 which will bring a more recent version of Scalaz in scope.