4

尝试在 Scala 的 Play 2.6 中测试控制器时出现空指针异常。这是对 OK 响应的测试:

class ApplicationControllerSpec extends PlaySpec
with MockitoSugar with ScalaFutures {

  val mockOrchestrator = mock[ApplicationOrchestrator]
  val mockCC = mock[ControllerComponents]
  val controller = new ApplicationController(mockOrchestrator, mockCC)
  val method = controller.home()(FakeRequest())

  assert(status(method) == 200)
}

这是我正在测试的控制器:

class ApplicationController @Inject()
(orchestrator: ApplicationOrchestrator, cc: ControllerComponents)
extends AbstractController(cc) with I18nSupport {

    def home(): Action[AnyContent] = Action {
      implicit request: RequestHeader => //line 29
        Ok(views.html.home())
    }
}

该错误看起来与隐式请求相关,但我找不到解决方案。

日志输出为:

java.lang.NullPointerException was thrown. java.lang.NullPointerException at controllers.ApplicationController.home(ApplicationController.scala:29)

4

2 回答 2

8

NPE 是因为您使用的是mock[ControllerComponents]. 只需将其替换为stubControllerComponents(),事情就会按预期工作。

当您调用未正确模拟的方法或访问字段时,NPE 会发生在测试中。

我猜你错过了阅读这篇文章。https://www.playframework.com/documentation/2.6.x/Highlights26#StubControllerComponents

于 2017-08-03T14:29:24.610 回答
0

该方法期望将请求输入其中,而您尚未输入有效请求。看起来您需要将一些参数输入 FakeRequest。

如果在您的 routes.conf 文件中,您将该控制器的方法连接为:

GET /home controllers.ApplicationController.home

然后在你的单元测试这一行:

val method = controller.home()(FakeRequest())

真的应该是:

val method = controller.home().apply(FakeRequest(GET, "/home"))

现在您应该可以按预期运行测试了。

于 2017-07-19T12:47:16.673 回答