I am trying to integrate scalacheck testing into my project, but get a ClassNotFoundException for the test class:
[info] set current project to MiniatureGiantSpaceHamster (in build file:/home/turin/porn/hamster/)
[info] compiling 1 Scala source to /home/turin/porn/hamster/target/scala-2.13/test-classes ...
[error] java.lang.ClassNotFoundException: HamsterTest
[error] at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:445)
[error] at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588)
[error] at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
[error] at java.base/java.lang.Class.forName0(Native Method)
[error] at java.base/java.lang.Class.forName(Class.java:390)
[error] at java.base/java.lang.Class.forName(Class.java:381)
[error] at $9f7a0fbfb4ca874acaca$.$anonfun$$sbtdef$2(/home/turin/porn/hamster/build.sbt:15)
[error] at $9f7a0fbfb4ca874acaca$.$anonfun$$sbtdef$2$adapted(/home/turin/porn/hamster/build.sbt:15)
[error] at sbt.Tests$.$anonfun$processOptions$4(Tests.scala:288)
[error] at sbt.Tests$.$anonfun$processOptions$4$adapted(Tests.scala:288
[error] at scala.collection.LinearSeqOptimized.forall(LinearSeqOptimized.scala:85)
[error] at scala.collection.LinearSeqOptimized.forall$(LinearSeqOptimized.scala:82)
[error] at scala.collection.immutable.List.forall(List.scala:91)
[error] at scala.collection.generic.TraversableForwarder.forall(TraversableForwarder.scala:43)
[error] at scala.collection.generic.TraversableForwarder.forall$(TraversableForwarder.scala:43)
[error] at scala.collection.mutable.ListBuffer.forall(ListBuffer.scala:47)
[error] at sbt.Tests$.includeTest$1(Tests.scala:288)
[error] at sbt.Tests$.$anonfun$processOptions$5(Tests.scala:289)
[error] at sbt.Tests$.$anonfun$processOptions$5$adapted(Tests.scala:289
[error] at scala.collection.TraversableLike.$anonfun$filterImpl$1(TraversableLike.scala:304)
[error] at scala.collection.Iterator.foreach(Iterator.scala:943)
[error] at scala.collection.Iterator.foreach$(Iterator.scala:943)
[error] at scala.collection.AbstractIterator.foreach(Iterator.scala:1431)
[error] at scala.collection.IterableLike.foreach(IterableLike.scala:74)
[error] at scala.collection.IterableLike.foreach$(IterableLike.scala:73
[error] at scala.collection.AbstractIterable.foreach(Iterable.scala:56)
[error] at scala.collection.TraversableLike.filterImpl(TraversableLike.scala:303)
[error] at scala.collection.TraversableLike.filterImpl$(TraversableLike.scala:297)
[error] at scala.collection.AbstractTraversable.filterImpl(Traversable.scala:108)
[error] at scala.collection.TraversableLike.filter(TraversableLike.scala:395)
[error] at scala.collection.TraversableLike.filter$(TraversableLike.scala:395)
[error] at scala.collection.AbstractTraversable.filter(Traversable.scala:108)
[error] at sbt.Tests$.processOptions(Tests.scala:289)
[error] at sbt.Defaults$.$anonfun$allTestGroupsTask$1(Defaults.scala:1529)
[error] at scala.collection.immutable.List.map(List.scala:293)
[error] at sbt.Defaults$.allTestGroupsTask(Defaults.scala:1528)
[error] at sbt.Defaults$.$anonfun$testTasks$10(Defaults.scala:1253)
[error] at scala.Function1.$anonfun$compose$1(Function1.scala:49)
[error] at sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:62)
[error] at sbt.std.Transform$$anon$4.work(Transform.scala:68)
[error] at sbt.Execute.$anonfun$submit$2(Execute.scala:282)
[error] at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:23)
[error] at sbt.Execute.work(Execute.scala:291)
[error] at sbt.Execute.$anonfun$submit$1(Execute.scala:282)
[error] at sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:265)
[error] at sbt.CompletionService$$anon$2.call(CompletionService.scala:64)
[error] at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
[error] at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:577)
[error] at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
[error] at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
[error] at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
[error] at java.base/java.lang.Thread.run(Thread.java:1589)
[error] (Test / executeTests) java.lang.ClassNotFoundException: HamsterTest
I see that the exception mentions "HamsterTest" class, not "HamsterTest$", and my test is defined as an object:
[src/test/scala/HamsterTest.scala]
import org.scalacheck.{Prop, Properties}
object HamsterTest extends Properties("Hamster") {
property("tautology") = Prop.passed
}
Is it a bug in the scalacheck plugin? Can you recommend a workaround? I know how to edit test source file list, but have no idea how to change what seems to be a "HamsterTest.scala" -> "HamsterTest.class" association to "HamsterTest$.class". I'd like to still use an object, rather than a class, because it can be easily run from IntelliJ.
My build.sbt:
organization := "united.hamsters"
name := "MiniatureGiantSpaceHamster"
version := "boo"
scalaVersion := "2.13.11"
Compile / fork := true
Compile / javaOptions ++= Seq("-Xmx4G")
Test / testOptions ++= Seq(Tests.Filter {
s => !(Class.forName(s).isInterface || java.lang.reflect.Modifier.isAbstract(Class.forName(s).getModifiers))
})
libraryDependencies ++= Seq( //todo: make shapeless optional
"org.scala-lang" % "scala-compiler" % scalaVersion.value,
"org.scala-lang" % "scala-library" % scalaVersion.value,
"org.scala-lang" % "scala-reflect" % scalaVersion.value,
"org.scalacheck" %% "scalacheck" % "1.17.0" % "test"
)
scalacOptions ++= Seq(
"-Vimplicits",
"-Xlog-reflective-calls",
"-Xlint:delayedinit-select,implicit-not-found,option-implicit,poly-implicit-overload,nullary-unit",
"-Wconf:cat=deprecation&msg=foldLeft:silent,cat=deprecation&msg=foldRight:silent,cat=deprecation:w,cat=feature:w",
"-Wunused:patvars,privates,locals",
"-feature",
"-language:implicitConversions",
"-language:higherKinds",
"-language:reflectiveCalls",
"-language:existentials"
)