为什么这个简单的主轴报价无法编译?

时间:2019-04-26 15:37:31

标签: scala quill

我正在尝试使用scala和鹅毛笔(getquill.io)。下面的这个最小示例无法编译。这是为什么?它仅定义一个类。我怀疑我需要以某种方式将班级标记为鹅毛笔才能解析它,但我不知道如何。我因为精打细算而被吸引,因为我不必标记案例类,它们应该可以工作,对吗?

package dbquerytest

import io.getquill._
/*in a real life you would rather pass execution context as
  a method or constructor argument, but we're just playing*/
import scala.concurrent.ExecutionContext.Implicits.global

import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test

case class Intake( id:Int, path:String, stage:Int) // , timestamp: Instant

// running/using junit test:https://alvinalexander.com/scala/how-to-use-junit-testing-with-scala
class MysqlLocalDbTest  {
  @Test
  def testIntake={
    val ctx = new MysqlAsyncContext(SnakeCase, "testdb")
    import ctx._
    val intakes = quote { query[Intake].map(_.id )}
    ctx.run(intakes).map(_.headOption)

    assertEquals(0,0)
  }
}

在io.getquill.quotation.Parsing处编译失败。

1 个答案:

答案 0 :(得分:4)

首先,我可以看到您在代码段中使用的是JUnit 5,但是reg似乎存在一些问题。将JUnit 5与Scala和sbt结合使用:https://github.com/sbt/junit-interface/issues/75。替代方法包括使用JUnit 4或Scala特定的测试库之一(例如ScalaTest或specs2)(ScalaCheck也有提及,尽管我通常只将其与ScalaTest或specs2结合使用)。

第二,我不知道您使用的是哪个构建工具,以及您是否拥有所有相关的依赖关系,这可能是导致编译错误的原因。如果您使用的是sbt(https://www.scala-sbt.org/),我认为这是在使用Scala进行开发时最常用的构建工具,那么如何看待您的示例的一个可能示例是(使用JUnit 4):

build.sbt:

import Dependencies._

ThisBuild / scalaVersion     := "2.12.8"
ThisBuild / version          := "0.1.0-SNAPSHOT"
ThisBuild / organization     := "com.example"
ThisBuild / organizationName := "example"

lazy val root = (project in file("."))
  .settings(
    name := "quilltesting",
    libraryDependencies ++= Seq(
      "mysql" % "mysql-connector-java" % "8.0.15",

      "io.getquill" %% "quill-jdbc" % "3.1.0",
      "io.getquill" %% "quill-async-mysql" % "3.1.0",

      // JUnit 4.
      "com.novocode" % "junit-interface" % "0.11" % Test
    )
  )

要使用sbt从头开始生成一个快速项目进行测试,请在某个地方创建一个新文件夹,从命令行进入该文件夹并运行sbt new sbt/scala-seed.g8。然后进入文件夹,并运行sbt。之后,运行test

我将您的示例更改为使用JUnit 4,它似乎可以编译并运行:

package dbquerytest

import io.getquill._

/*in a real life you would rather pass execution context as
  a method or constructor argument, but we're just playing*/
import scala.concurrent.ExecutionContext.Implicits.global

import org.junit.Test
import junit.framework.TestCase
import org.junit.Assert._

case class Intake( id:Int, path:String, stage:Int)

// running/using junit test:https://alvinalexander.com/scala/how-to-use-junit-testing-with-scala
class MysqlLocalDbTest  {
  @Test
  def testIntake = {
    val ctx = new MysqlAsyncContext(SnakeCase, "testdb")
    import ctx._
    val intakes = quote { query[Intake].map(_.id )}
    ctx.run(intakes).map(_.headOption)

    assertEquals(0,0)
  }
}

如果您想尝试其他示例,还可以访问https://scastie.scala-lang.org/QwOewNEiR3mFlKIM7v900A中的https://getquill.io/#quotation-introduction