在 Play 2.6 中对控制器进行单元测试
Unit testing a controller in Play 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)
}
这是我正在测试的控制器:
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)
该方法需要输入一个请求,而您没有输入有效请求。看来您需要向 FakeRequest 提供一些参数。
如果在您的 routes.conf 文件中,您将该控制器的方法连接为:
GET /home controllers.ApplicationController.home
然后在你的单元测试这一行:
val method = controller.home()(FakeRequest())
真的应该是:
val method = controller.home().apply(FakeRequest(GET, "/home"))
现在您应该可以 运行 按预期进行测试了。
NPE 是因为您正在使用 mock[ControllerComponents]
。只需用 stubControllerComponents()
替换它,事情就会按预期进行。
当您调用未正确模拟的方法或访问字段时,测试中会发生 NPE。
我猜你错过了阅读这篇文章。 https://www.playframework.com/documentation/2.6.x/Highlights26#StubControllerComponents
尝试在 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)
该方法需要输入一个请求,而您没有输入有效请求。看来您需要向 FakeRequest 提供一些参数。
如果在您的 routes.conf 文件中,您将该控制器的方法连接为:
GET /home controllers.ApplicationController.home
然后在你的单元测试这一行:
val method = controller.home()(FakeRequest())
真的应该是:
val method = controller.home().apply(FakeRequest(GET, "/home"))
现在您应该可以 运行 按预期进行测试了。
NPE 是因为您正在使用 mock[ControllerComponents]
。只需用 stubControllerComponents()
替换它,事情就会按预期进行。
当您调用未正确模拟的方法或访问字段时,测试中会发生 NPE。
我猜你错过了阅读这篇文章。 https://www.playframework.com/documentation/2.6.x/Highlights26#StubControllerComponents