我怎样才能知道从哪里选择隐式值

how can i found out from where an implicit value is being picked

我观察到一个奇怪的行为。在我的一个测试用例中,我使用 contentAsJson。在那个测试用例中,编译器没有抱怨我必须为 TimeoutMaterializer

提供 implicit
class UserControllerUnitSpec extends PlaySpec with BeforeAndAfterAll with BeforeAndAfterEach with OneAppPerSuiteWithComponents{
..
  "User signup request with body but with incorrect profile data " should {
    "return error message " in {

...val resultFuture: Future[Result] = testEnv.controller.signupUser(request)
    val responseBodyAsJsValue: JsValue = contentAsJson(resultFuture)//works
...
}
}

但是在另一个测试用例中,编译器报错,我需要提供值

class QuestionsControllerUnitSpec extends PlaySpec with BeforeAndAfterAll with BeforeAndAfterEach with OneAppPerSuiteWithComponents{
...
"newQuestion" should {
    "should return error if the size of the body in the request is more than the maximum allowed size" in {
...
val response:Accumulator[ByteString,Result] = questionController.newQuestion(request)
val responseBody = contentAsJson(response)//(Timeout(Duration(5000,"millis")),testEnv.testEnv.mat). 
...
}

我收到错误

Error:(1485, 39) could not find implicit value for parameter mat: akka.stream.Materializer
      val responseBody = contentAsJson(response)//(Timeout(Duration(5000,"millis")),testEnv.testEnv.mat)

我如何调试为什么一个工作正常而另一个不工作?

更新 - 在马里奥的回答后添加了 return 类型。

尝试像这样提供隐式 Materializer

import play.api.test.Helpers._
implicit val actorSystem = ActorSystem("test")
implicit val materializer = ActorMaterializer()
val responseBody = contentAsJson(response)

而不是明确的testEnv.testEnv.mat

contentAsJson(response)(Timeout(Duration(5000,"millis")),testEnv.testEnv.mat)

关于两个测试之间的区别,请注意 contentAsJson

有两个重载版本
def contentAsJson(of: Future[Result])(implicit timeout: Timeout, mat: Materializer = NoMaterializer): JsValue

def contentAsJson(of: Accumulator[ByteString, Result])(implicit timeout: Timeout, mat: Materializer): JsValue

在第一种情况下,我们看到提供了默认 Materializer 参数

mat: Materializer = NoMaterializer

而在第二种情况下,我们必须提供自己的。因此,在第一次测试中,resultFuture 的类型很可能是 Future[Result],而在第二次测试中,response 的 return 类型可能是 Accumulator

关于查找提供隐式的位置,我个人使用 IntelliJ 的 View | Show Implicit Hints 功能。