0

次のようにScalaに関数があります

object MyService extends MyTrait {    
  def myMethod[T <% InvokableBuilder[MyClass]](builder: T): MyResponse = {
  //do something
  }
}

次のようにmockitoを使用してこの関数をモックしようとしています

val mockService = mock[MyTrait]

doReturn(info).when(mockService).myMethod(any())

関数に引数が1つしかないのに、次のエラーが発生します

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 引数マッチャーの使用が無効です! [情報] 2 人のマッチャーが予想され、1 人が記録されました:

4

2 に答える 2

0

// do something を ??? に変更しました コンパイルしてから、パーサー フェーズの最後にコードを出力します。

$scalac MyService.scala -Xprint:parser
[[syntax trees at end of                    parser]] // MyService.scala
package <empty> {
  object MyService extends MyTrait {
    def <init>() = {
      super.<init>();
      ()
    };
    def myMethod[T](builder: T)(implicit evidence$1:_root_.scala.Function1[T,InvokableBuilder[MyClass]]): MyResponse = $qmark$qmark$qmark
  }
}

ご覧のとおり、ビュー バウンドにより、myMethod には 2 番目のパラメーター リストがあります。Mockito でそれをどのようにモックするかはわかりませんが、ScalaMock を試してみることをお勧めします。

注: ビューの境界は非推奨です。それらを暗黙のパラメーターに置き換えることをお勧めします (上記の scalac パーサーがどのようにそれを行うかを参照してください)。

長い例:

import org.scalamock.scalatest.MockFactory
import org.scalatest.FlatSpec

import scala.language.implicitConversions

class FooTest extends FlatSpec with MockFactory {

  trait MyTrait {
    def myMethod[T](builder: T)(implicit ev$1: T => InvokableBuilder[MyClass]): MyResponse
  }

  trait InvokableBuilder[T]

  class MyClass

  class MyResponse

  class Foo

  object MyService extends MyTrait {
    def myMethod[T](builder: T)(implicit ev$1: T => InvokableBuilder[MyClass]): MyResponse = {
      //do something
      ???
    }
  }

  behavior of "Foo"

  it should "foo" in {
    val x = mock[MyTrait]

    implicit val fooConvert: Foo => InvokableBuilder[MyClass] = ???
    (x.myMethod(_: Foo)).expects(*).once()
  }

}
于 2017-04-25T14:23:10.827 に答える