在Play 2.6中对控制器进行单元测试

时间:2017-07-07 13:56:48

标签: scala unit-testing playframework playframework-2.6

尝试在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)
}

这是控制器I测试:

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)

2 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:0)

该方法需要将请求输入其中,并且您还没有向其提供有效请求。看起来您需要将一些参数提供给FakeRequest。

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

GET /home controllers.ApplicationController.home

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

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

应该是:

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

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