6

私はScalaを学習している最中であり、今日、私たちのプロジェクトの1つにScalaを紹介することに自信を持っています。

このアプリケーションは多くのJPA/Hibernateを実行し、ScalaでJavaインターフェースの1つを実装し始めました。unittestコードをScalaに変換しようとするまで、すべてうまくいきました。

私はEasymockを多用していますが、コードは非常に自明です。問題は、Scalaでは、型指定されていないjava.util.Listを予期している場所に型付きjava.util.Listを返すことができないことだと思います。残念ながら、型パラメーターを期待するものをScalaにキャストさせる方法がわかりません。

私の問題を説明/再現するコード:

package some.package.name

import java.util.ArrayList
import java.util.List
import javax.persistence.Query
import org.easymock.EasyMock._
import org.junit.Assert._
import org.junit.Test

class MyGreatScalaTest {

  @Test
  def testSomething() : Unit = {

    val mockQuery: Query = createMock(classOf[Query])
    val mockResult: List[String] = new ArrayList[String]
    mockResult.add("great value")

    expect(mockQuery.getResultList).andReturn(mockResult)
    replay(mockQuery)

    assertEquals(
      (mockQuery.getResultList.asInstanceOf[List[String]]).get(0),
      "great value")

    verify(mockQuery)
  }
}

これにより、次のコンパイラエラーが発生します。

[WARNING]  found   : java.util.List[String]
[WARNING]  required: java.util.List[?0] where type ?0
[WARNING]     expect(mockQuery.getResultList).andReturn(mockResult)
[WARNING]                                               ^     

ご覧のとおり、java.util.Listを返すjavax.persistence.Queryのインターフェースを実装するためのモックが必要です。

4

1 に答える 1

11

javax.persistence.Query#getResultListのような *cooked8 タイプとは対照的に、 rawタイプを返します。Java は、バージョン 1.5 で標準ライブラリの多くを生成しましたが、1.4 用に作成されたバイナリおよびソースとの下位互換性を維持する必要がありました。ListList[String]

Scala コンパイラは、このような厄介な型を許容しますが、List[_]の省略形である に変換しList[?0] forSome { type ?0 }ます。これは存在型として知られており、リストの要素の型が特定の型であることを意味しますが、厳密にはどの型かはわかりません!

Easymock では、 へandReturnの引数が に渡される引数の型と同じ型である必要があります。これexpectは厄介な存在型です。

これで問題が解決すると思います:

expect(mockQuery.getResultList.asInstanceOf[List[String]]).andReturn(mockResult)
于 2010-07-20T20:21:30.510 に答える