8

完全な開示:私はモックとモックのフレームワークに非常に慣れていません。ScalaTestで使用する「デフォルト」のモックフレームワークのように見えたため、ScalaMockを使用しようとしていますが、ScalaTestと互換性のある他のフレームワークを使用できてうれしいです。

問題:私はScalaでソケットと通信するクラスを作成しました。このクラスには、通信するソケットの種類の型パラメーターがあり、その引数の1つは、その型のソケットを作成するためのファクトリです。署名があります:

class XScanner[T <: SocketClient](
  confPath: String = "/etc/default/configPath",
  socketClientFactory: String => T
) extends ScannerBase(path)

モックSocketClientを提供することで、このクラスの単体テストを記述できるようにしたいので、テストコードを実際のソケットに接続する必要はありませんが、ScalaMockでこれを行う方法を理解できません。

私のテストコードは次のようになります。

val t = new XScanner[SocketClient](confPath, (s: String) => mock[SocketClient])

明らかにSocketClient、引数としてソケットへのパスを期待しているため、コンパイルされませんがmock[SocketClient(s)]、それは型ではないため呼び出すことができずmock[SocketClient](s)、モックは渡された型の引数を独自のものとして受け取らないため、呼び出すことができません引数。

SocketClientでは、スキャナーに渡すためのモックファクトリーを作成するにはどうすればよいですか?引数を取るクラスをモックする方法すら理解できません!

4

1 に答える 1

4

洞察は、モックする必要があるのはsocketClientFactory. そして、 mock を返すように設定しSocketClientます。

与えられた:

trait SocketClient {
  def frobnicate(): Unit
}

class ScannerBase(path: String)

class XScanner[T <: SocketClient](
  confPath: String = "/etc/default/configPath",
  socketClientFactory: String => T
) extends ScannerBase(confPath) {
  val socket = socketClientFactory("Some Socket Name")
  socket.frobnicate
}

(補足- のデフォルト値confPathがないため、 のデフォルト値は使用できませんsocketClientFactory)。

これで始められるはずです (これは Scala 2.9.x と ScalaMock2 の場合です - 2.10.x と ScalaMock3 は少し異なりますが、それほど違いはありません):

import org.scalatest.FunSuite
import org.scalamock.scalatest.MockFactory
import org.scalamock.generated.GeneratedMockFactory

class ScannerTest extends FunSuite with MockFactory with GeneratedMockFactory {

  test("scanner") {
    val mockFactory = mockFunction[String, SocketClient]
    val mockClient = mock[SocketClient]
    mockFactory.expects("Some Socket Name").returning(mockClient)
    mockClient.expects.frobnicate
    val scanner = new XScanner("path/to/config", mockFactory)
  }
}

完全を期すために、Scala 2.10.0 と ScalaMock3 での同じテストを次に示します。

import org.scalatest.FunSuite
import org.scalamock.scalatest.MockFactory

class ScannerTest extends FunSuite with MockFactory {

  test("scanner") {
    val mockFactory = mockFunction[String, SocketClient]
    val mockClient = mock[SocketClient]
    mockFactory.expects("Some Socket Name").returning(mockClient)
    (mockClient.frobnicate _).expects()
    val scanner = new XScanner("path/to/config", mockFactory)
  }
}
于 2013-01-11T09:59:32.300 に答える