Почему эта простая цитата не скомпилирована? - PullRequest
3 голосов
/ 26 апреля 2019

Я пробую скалу и перо (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 Ответ

4 голосов
/ 27 апреля 2019

Прежде всего, я вижу, что вы используете JUnit 5 в фрагменте кода, но, похоже, есть некоторые проблемы, связанные с. используя 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.

...