首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scalamock scalatest -无法存根

Scalamock scalatest -无法存根
EN

Stack Overflow用户
提问于 2015-05-14 08:40:23
回答 1查看 1.4K关注 0票数 0

我已经创建了一个类似于下面提到的工作流处理器特征:

代码语言:javascript
复制
import org.scalatestplus.play._
import play.api.mvc._
import play.api.test._
import play.api.test.Helpers._
import org.scalatest.Matchers._
import org.scalamock.scalatest.MockFactory
import utils.OAuthUtils._
import utils.OAuthUtils
import utils.OAuthProcess
import play.api.Application
import scala.concurrent.ExecutionContext
import scala.concurrent.Future
import play.api.libs.json.JsResult
import play.api.libs.json.Json
import play.api.libs.json.JsSuccess
import play.api.libs.json.JsError
import play.api.libs.ws.WS



trait MyProcess[A] {
  type B
  type C
  type D
  def stage1(s: String): B
  def stage2(b: B)(implicit e: ExecutionContext, app: Application, a: A):       Future[C]
  def stage3(c: C)(implicit e: ExecutionContext, app: Application, a: A): Future[JsResult[D]]
  def process(s: String)(implicit e: ExecutionContext, app: Application, a: A): Future[JsResult[D]] = {
   val b = stage1(s)
   val f_d = for {
      c <- stage2(b)
      d <- stage3(c)
   } yield d
   f_d
 }
}

现在我想对这段代码进行单元测试。因此,我创建了一个更好的、可伸缩的小型scalamock测试套件:

代码语言:javascript
复制
class TestController extends PlaySpec with Results with MockFactory {
  "MyController" must {
    " testing for method process" in {
  running(FakeApplication()) {

    implicit val context = scala.concurrent.ExecutionContext.Implicits.global
    implicit val s = "implicit String"
    implicit val currentApp = play.api.Play.current

  case class TestParms(s: String)
  abstract class TestProcessor extends MyProcess[TestParms] {
      type B = String
      type C = String
      type D = String
    }

    implicit val t = stub[TestProcessor]
    t.stage1(_: String).when(token).returns(testToken)

    (t.stage2(_: String)(_: ExecutionContext, _: Application, _: TestParms)).when(token, context, currentApp, tp).returns({
      Future.successful(stage2String)
    })
    (t.stage3(_: String)(_: ExecutionContext, _: Application, _: TestParms)).when(token, context, currentApp, tp).returns({
      Future.successful(Json.fromJson[String](Json.parse(stage3String)))
     })
   }
 }
}
}

我的期望是将这个存根设置在不同的类上,并测试这个类。存根(t.stage2和t.stage3)编译得很好,但是下面的语句不能编译。

代码语言:javascript
复制
 t.stage1(_: String).when(token).returns(testToken)

编译器报告以下问题:

代码语言:javascript
复制
overloaded method value when with alternatives:   (resultOfAfterWordApplication: org.scalatest.words.ResultOfAfterWordApplication)Unit <and>   (f: => Unit)Unit  cannot be applied to (String)  TestController.scala  /play-scala/test/controllers

有人能帮帮忙吗?我发现为Scala类编写单元测试以及模拟它们是非常困难的。

来自Build.sbt的最新版本:

代码语言:javascript
复制
 "org.scalatestplus" %% "play" % "1.2.0" % "test",
 "org.scalamock" %% "scalamock-scalatest-support" % "3.2" % "test",
EN

回答 1

Stack Overflow用户

发布于 2015-06-15 05:45:26

尝试将调用放在括号中

代码语言:javascript
复制
(t.stage1(_: String)).when(token).returns(testToken)

我相信scalac认为您正在尝试调用String实例上的when (因为这将是t.stage1(_)返回的内容)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30227496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档