私はScala、Play Frameworkを使ってWebアプリケーションを開発しています。そして私はカスタムアクションでコントローラをテストする必要があります。コードを見てください:関数のモック関数引数
package controllers.helpers
import play.api.mvc.{ActionBuilder, Request, Result}
import scala.concurrent.Future
class CustomAction extends ActionBuilder[Request] {
override def invokeBlock[A](request: Request[A], block: (Request[A]) => Future[Result]): Future[Result] = {
// do some stuff
block(request)
}
}
package controllers
import javax.inject.Singleton
import play.api.mvc.Controller
@Singleton
class SomeController @Inject() (customAction: CustomAction
) extends Controller {
def foo() = customAction(parse.json) { implicit request =>
// do some stuff and create result
}
}
以下では、テストクラスのコードを見つけることができます。私はSpecs2を使用して、私は私が間違ってCustomAction
のblock
パラメータを模擬することを理解customeActionMock.invokeBlock(any[Request[_]], any[(Request[_]) => Future[Result]]) returns mock[Future[Result]]
package controllers
import controllers.helpers.CustomAction
import org.specs2.mock.Mockito
import play.api.mvc.{Request, Result}
import play.api.test.{FakeHeaders, FakeRequest, PlaySpecification}
import scala.concurrent.Future
class SomeControllerSpec extends PlaySpecification with Mockito {
private val customeActionMock = mock[CustomAction]
customeActionMock.invokeBlock(any[Request[_]], any[(Request[_]) => Future[Result]]) returns mock[Future[Result]] //this doesn't work, exception is thrown there
"SomController" should {
"respond Ok on valid request" in {
val result = new UserController(customeActionMock).foo()(FakeRequest())
status(result) shouldEqual OK
}
}
}
とライン上org.mockito.exceptions.misusing.InvalidUseOfMatchersException
を得ました。誰かが私にそれを適切にするのを助けることができますか?
あなたのテストの設定方法は、 'result'という値はmockされた値' mock [Future [Result]] 'を保持します。別の言い方をすれば、 'block'を実行するはずのコードを偽装すると、アクション内のコードは実行されません。私は' CustomAction'を模倣しないでテストの一部にすると思います。 – rethab