0

これが私が達成しようとしていることの例です。スタブは常に null を返しますが、変更Array(1L)する*と機能します。配列引数に問題があるようです。

trait Repo {
    def getState(IDs: Array[Long]): String
}


"test" should "pass" in {
    val repo = stub[Repo]
    (repo.getState _).when(Array(1L)).returns("OK")
    val result = repo.getState(Array(1L))
    assert(result == "OK")
}
4

1 に答える 1

2

この投稿を参照してください。

Array の == 関数が Array(1,2) == Array(1,2) に対して true を返さないのはなぜですか?

ScalaMock は正常に動作していますが、配列の等価性により、予想される引数が実際の引数と一致しません。

たとえば、これは機能します:

 "test" should "pass" in {
   val repo = stub[Repo]
   val a = Array(1L)
   (repo.getState _).when(a).returns("OK")
   val result = repo.getState(a)
   assert(result == "OK")
 }

org.scalamock.matchers.ArgThatただし、カスタム マッチャー ( で定義)を追加する方法もあります。

 "test" should "pass" in {
   val repo = stub[Repo]
   (repo.getState _).when(argThat[Array[_]] {
     case Array(1L) => true
     case _ => false
   }).returns("OK")
   val result = repo.getState(Array(1L))
   assert(result == "OK")
 }

更新 - 混合ワイルドカード、リテラル、argThat の例:

 trait Repo {
   def getState(foo: String, bar: Int, IDs: Array[Long]): String
 }

 "test" should "pass" in {
   val repo = stub[Repo]
   (repo.getState _).when(*, 42, argThat[Array[_]] {
     case Array(1L) => true
     case _ => false
   }).returns("OK")
   val result = repo.getState("banana", 42, Array(1L))
   assert(result == "OK")
 }
于 2017-07-10T19:02:26.197 に答える