【问题标题】:fail to simulate play api Request模拟播放 api 请求失败
【发布时间】:2019-11-19 07:08:57
【问题描述】:

我有一个类接收Option[Request[_]] 作为隐式(play.api.mvc.Request):

class MyClass @Inject()(...)(implicit val request: Option[Request[_]]) { ...

我的问题是在我使用 play.api.test.inject 的测试中,例如:

  val myClass: MyClass = inject[MyClass]

为了能够在我的测试中做到这一点,我必须隐含这个请求。所以我的做法是像这样使用mockito.ArgumentMatchers

  implicit val origReq: Option[Request[_]] = any[Option[Request[_]]]

但是当我运行测试时,我得到了这个错误:

An exception or error caused a run to abort: Guice configuration errors:

1) No implementation for scala.Option<play.api.mvc.Request<?>> was bound.
  while locating scala.Option<play.api.mvc.Request<?>>
    for the 3rd parameter of streams.MyClass.<init>(MyClass.scala:16)
  while locating streams.MyClass

1 error 
com.google.inject.ConfigurationException: Guice configuration errors:

1) No implementation for scala.Option<play.api.mvc.Request<?>> was bound.
  while locating scala.Option<play.api.mvc.Request<?>>
    for the 3rd parameter of streams.MyClass.<init>(MyClass.scala:16)
  while locating streams.MyClass

我做错了什么? :/

【问题讨论】:

  • 也许Option[any[Request[_]]]???
  • @MikhailIonkin 尝试了implicit val origReq: Option[Request[_]] = Some(ArgumentMatchers.any[Request[_]]) 不幸的是仍然无法正常工作
  • 同样的异常?
  • @MikhailIonkin 是的,让我抓狂..
  • 你能得到 val without 选项吗?并且在您可以创建将包装它的隐式 val 之后。我认为这个问题是 mokito 不能有 Option 的所有类型的实现

标签: scala playframework mockito playframework-2.0 playframework-2.3


【解决方案1】:

问题是您正在定义一个应该由 guice 实例化的类,它需要一个可选请求,您很可能需要这个请求实际上是请求范围的(每个请求中的不同对象)玩起来并不简单。

我不知道inject[MyClass] 的行为如何,我猜它不会在范围内寻找隐式可选请求,但它会尝试使用可用模块实例化MyClass(即时绑定不是'足够了,因为Request[_] 不是具体的,您可以通过为您的测试定义一个特定的绑定来让测试通过,但让应用程序工作并不容易),无论如何,提供具有泛型类型的对象不是就这么简单,因为单个Request[_] 有许多可能的实现,考虑用IntString 等替换_

一个好主意是重构 MyClass 以要求每个方法上的隐式请求,这解决了有问题的配置。

如果您仍想使用构造函数上的隐式请求,则需要查看 play 上的请求范围绑定,这本身就是一个主题。

【讨论】:

    猜你喜欢
    • 2021-10-29
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 2019-11-03
    • 2012-08-13
    • 1970-01-01
    • 2012-06-09
    • 2020-06-19
    相关资源
    最近更新 更多