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

## 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` に移行していくのが良いと思われる。

## 起こった問題
利用しているプラグインが以下のとき、

```scala: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を使っていたときは動いていたテストコードがコンパイルエラーになりました。

```scala: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 {
```

## ひとまずの対応
調べていると[公式のリリースアナウンスメント](https://twitter.github.io/finatra/blog/2017/02/06/announcing-the-finatra-2-dot-8-0-release/)が見つかりました。

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

```diff: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`形式に書き換えました。

```diff: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](https://folio-sec.com/)では、利用しているOSSの最新動向を追いながら開発を進められる、次世代オンライン証券を構築する[エンジニアを募集中](https://www.wantedly.com/projects/79013)です。