3

私はscala(長年のJava開発者)が初めてです。私は暗黙を理解しようとしましたが、基本は理解していると思いますが、暗黙の値が見つからない理由がわかりませんsession。できるだけ多くの情報で問題を説明しようとしました。

次のブログ投稿に従いました: http://blog.websudos.com/2015/04/04/a-series-on-phantom-part-1-getting-started-with-phantom/

テストするまで、すべてがうまくコンパイルされました。次のエラーが発生します。

Error:(15, 46) could not find implicit value for parameter session: com.datastax.driver.core.Session
    Await.result(Database.autocreate().future(), 5.seconds)
                                             ^
Error:(20, 48) could not find implicit value for parameter session: com.datastax.driver.core.Session
    Await.result(Database.autotruncate().future(), 5.seconds)
                                               ^

次のテストクラスを実行すると:

import org.joda.time.DateTime
import org.scalatest.{BeforeAndAfterAll, FlatSpec}

import scala.concurrent.Await
import scala.concurrent.duration._

class DatabaseTest extends FlatSpec with BeforeAndAfterAll{
  override def beforeAll(): Unit = {
    super.beforeAll()
    Await.result(Database.autocreate().future(), 5.seconds)
  }

  override def afterAll(): Unit = {
    super.afterAll()
    Await.result(Database.autotruncate().future(), 5.seconds)
  }

  "A TwitterMessage" should "be stored in cassandra" in {
    val twitterMessageBefore = TwitterMessage(1L, DateTime.now, "This is a message", "me", "none")

    Database.twitterMessages.store(
      twitterMessageBefore
    )

    val twitterMessageAfter:Option[TwitterMessage] = Await.result(Database.twitterMessages.getById(1L), 5.seconds)

    assert(twitterMessageAfter.isDefined, "No entry was found regarding the id.")

    assert(twitterMessageAfter.get equals twitterMessageBefore)
  }
}

以下に書いた他のクラスもコピーしました。

TwitterMessages.scala

import com.websudos.phantom.dsl._

import scala.concurrent.Future

case class TwitterMessage (
  id: Long,
  timestamp: DateTime,
  msg: String,
  user: String,
  category: String
)

sealed class TwitterMessages extends CassandraTable[ConcreteTwitterMessages, TwitterMessage]{
  object id extends LongColumn(this) with PartitionKey[Long]
  object timestamp extends DateTimeColumn(this)
  object msg extends StringColumn(this)
  object user extends StringColumn(this)
  object category extends StringColumn(this)

  def fromRow(row: Row): TwitterMessage = {
    TwitterMessage(
      id(row),
      timestamp(row),
      msg(row),
      user(row),
      category(row)
    )
  }
}

abstract class ConcreteTwitterMessages extends TwitterMessages with RootConnector{
  def store(twitterMessage: TwitterMessage): Future[ResultSet] = {
    insert.value(_.id, twitterMessage.id)
      .value(_.timestamp, twitterMessage.timestamp)
    .value(_.msg, twitterMessage.msg)
    .value(_.user, twitterMessage.user)
    .value(_.category, twitterMessage.category)
    .consistencyLevel_=(ConsistencyLevel.ALL)
    .future()
  }

  def getById(id: Long): Future[Option[TwitterMessage]] = {
    select.where(_.id eqs id).one()
  }
}

データベース.scala

import com.websudos.phantom.connectors.{ContactPoint, KeySpaceDef}

object Defaults {
  val connector = ContactPoint.local.keySpace("twitter")
}

class Database(val keyspace:KeySpaceDef) extends com.websudos.phantom.db.DatabaseImpl(keyspace){
  object twitterMessages extends ConcreteTwitterMessages with keyspace.Connector
}

object Database extends Database(Defaults.connector)
4

1 に答える 1

5

問題に具体的に対処するには、コネクタをテスト スイートに混ぜるだけです。この情報でブログ投稿を更新するのを忘れていたので、これは私の責任です。

class DatabaseTest extends FlatSpec with BeforeAndAfterAll
  with Defaults.connector.Connector
于 2015-09-24T09:28:04.477 に答える