LoginSignup
4
1

More than 5 years have passed since last update.

Finatra 2.8.0でFeatureTestのテストがコンパイルエラーになったときに読む記事

Last updated at Posted at 2017-02-12

TL;DR

  • コンパイルエラーが以下の内容なら、Finatra 2.8.0から FunSuite が標準になったことが原因である可能性が高い。
    • value when is not a member of String
    • value in is not a member of String
  • その場合、 FeatureTest の代わりに WordSpecFeatureTest を継承するようにすれば治る。
  • しかし WordSpecFeatureTest はdeprecatedなので、 FunSuite に移行していくのが良いと思われる。

起こった問題

利用しているプラグインが以下のとき、

build.sbt
lazy val versions = new {
  val finatra = "2.8.0"

  val guice = "4.0"
  val scalatest = "3.0.0"
  val specs2 = "2.4.17"
}

// ...

  settings(
    libraryDependencies ++= Seq(
      "com.twitter" %% "finatra-thrift" % versions.finatra,

      "org.scalatest" %% "scalatest" % versions.scalatest % "test",
      "org.specs2" %% "specs2-mock" % versions.specs2 % "test",

      "com.twitter" %% "finatra-thrift" % versions.finatra % "test",
      "com.twitter" %% "inject-app" % versions.finatra % "test",
      "com.twitter" %% "inject-core" % versions.finatra % "test",
      "com.twitter" %% "inject-modules" % versions.finatra % "test",
      "com.twitter" %% "inject-server" % versions.finatra % "test",
      "com.google.inject.extensions" % "guice-testlib" % versions.guice % "test",

      "com.twitter" %% "finatra-thrift" % versions.finatra % "test" classifier "tests",
      "com.twitter" %% "inject-app" % versions.finatra % "test" classifier "tests",
      "com.twitter" %% "inject-core" % versions.finatra % "test" classifier "tests",
      "com.twitter" %% "inject-modules" % versions.finatra % "test" classifier "tests",
      "com.twitter" %% "inject-server" % versions.finatra % "test" classifier "tests"
    )
  )

// ...

Finatra 2.6.0を使っていたときは動いていたテストコードがコンパイルエラーになりました。

VerboseServiceTest.scala
package com.github.laysakura.test.finatraquill.server

import com.github.laysakura.finatraquill.idl.VerboseService
import com.github.laysakura.finatraquill.server.VerboseServiceServer
import com.twitter.finatra.thrift.{EmbeddedThriftServer, ThriftClient}
import com.twitter.inject.app.TestInjector
import com.twitter.inject.server.FeatureTest
import com.twitter.util.{Await, Future}

class EmbeddedVerboseServiceTest extends FeatureTest {
  override val injector = TestInjector(
    modules = Seq(
      // ...
    )
  )

  override val server = new EmbeddedThriftServer(
    twitterServer = new VerboseServiceServer
  ) with ThriftClient

  lazy private val client = server.thriftClient[VerboseService[Future]]("EmbeddedVerboseServiceTest")

  "client" should {
    "successfully call echo() API" in {
      val res = Await.result(client.echo("hi :D"))
      res shouldBe "You said: hi :D"
    }
  }
}
コンパイルエラー
Error:(28, 36) value in is not a member of String
    "successfully call echo() API" in {

ひとまずの対応

調べていると公式のリリースアナウンスメントが見つかりました。

記載の内容に従い、 extends FeatureTest としている箇所を extends WordSpecFeatureTest に変更 すると、コンパイルエラーが解消されます。

VerboseServiceTest.scala
@@ -5,10 +5,10 @@
 import com.twitter.inject.app.TestInjector
-import com.twitter.inject.server.FeatureTest
+import com.twitter.inject.server.WordSpecFeatureTest
 import com.twitter.util.{Await, Future}

-class EmbeddedVerboseServiceTest extends FeatureTest {
+class EmbeddedVerboseServiceTest extends WordSpecFeatureTest {
   override val injector = TestInjector(

ただし、 WordSpecFeatureTest を利用している箇所でdeprecated warningが出ます。
今後はWordSpec形式ではなく FunSuite形式が標準になる流れ なようです。
(この点も上記のアナウンスメントに記載されています)

ちゃんとした対応

extends FeatureTest したまま、FunSuite形式に書き換えました。

VerboseServiceTest.scala
-  "client" should {
-    "successfully call echo() API" in {
-      val res = Await.result(client.echo(1, "hi :D"))
-      res shouldBe "Hi Ms., you said: hi :D"
-    }
+  test("successfully call echo() API") {
+    val res = Await.result(client.echo(1, "hi :D"))
+    res shouldBe "Hi Ms., you said: hi :D"

広告

株式会社FOLIOでは、利用しているOSSの最新動向を追いながら開発を進められる、次世代オンライン証券を構築するエンジニアを募集中です。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1