Scala 单元测试播放控制器时引发的NullPointerException';处理表单的操作

Scala 单元测试播放控制器时引发的NullPointerException';处理表单的操作,scala,unit-testing,playframework-2.5,Scala,Unit Testing,Playframework 2.5,在测试处理表单的操作时,我遇到了NullPointerException。有两个操作,一个用于显示,另一个用于处理表单。测试第一个是好的;但是,测试第二个会引发异常。这只发生在单元测试中;应用程序工作正常(即通过浏览器)。我不知道会发生什么。有人能帮我解释一下吗?我正在测试的代码如下所示 斯卡拉:2.11.8 SBT:0.13.11 游戏框架:2.5.2 构建.sbt lazy val root = (project in file(".")).enablePlugins(PlayScala

在测试处理表单的操作时,我遇到了
NullPointerException
。有两个操作,一个用于显示,另一个用于处理表单。测试第一个是好的;但是,测试第二个会引发异常。这只发生在单元测试中;应用程序工作正常(即通过浏览器)。我不知道会发生什么。有人能帮我解释一下吗?我正在测试的代码如下所示

  • 斯卡拉:2.11.8
  • SBT:0.13.11
  • 游戏框架:2.5.2
构建.sbt

lazy val root = (project in file(".")).enablePlugins(PlayScala)

scalaVersion := "2.11.8"

libraryDependencies ++= Seq(
  "org.mockito" % "mockito-core" % "1.10.19" % Test,
  "org.scalatestplus.play" %% "scalatestplus-play" % "1.5.1" % Test
)
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.5.2")
项目/插件.sbt

lazy val root = (project in file(".")).enablePlugins(PlayScala)

scalaVersion := "2.11.8"

libraryDependencies ++= Seq(
  "org.mockito" % "mockito-core" % "1.10.19" % Test,
  "org.scalatestplus.play" %% "scalatestplus-play" % "1.5.1" % Test
)
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.5.2")
conf/routes

GET     /           controllers.FormController.showForm
POST    /           controllers.FormController.processForm
app/controllers/FormController.scala

包控制器
导入javax.inject.inject
导入play.api.data.Form
导入play.api.data.Forms_
导入play.api.i18n.{I18nSupport,MessagesApi}
导入play.api.mvc_
案例类UserData(名称:String,电子邮件:String)
类FormController@Inject()(val messagesApi:messagesApi)扩展
控制器
I18N支持{
def showForm=动作{
Ok(views.html.showForm(getForm))
}
def processForm=操作{隐式请求=>
getForm.bindFromRequest.fold(
errForm=>Ok(views.html.showForm(errForm)),
userData=>Ok(userData.toString)
)
}
val getForm:Form[UserData]=表单(映射(
“名称”->非空文本,
“电子邮件”->电子邮件
)(UserData.apply)(UserData.unapply))
}
views/main.scala.html

@(content: Html)

<!DOCTYPE html>
<html lang="en">
<body>
  @content
</body>
</html>
@import helper._

@(myForm: Form[UserData])(implicit messages: Messages)

@main {
  <h3>Form</h3>
  @form(action = routes.FormController.processForm()) {
    @inputText(myForm("name"))
    @inputText(myForm("email"))
    <input type="submit" value="Submit">
  }
}
运行测试的输出:

[info] FormControllerSpec:
[info] FormController
[info]   when showForm
[info]   - should display the form
[info]   when processForm
[info]   - should redisplay the form in case of form errors *** FAILED ***
[info]     java.lang.NullPointerException:
[info]     at views.html.helper.FieldElements$$anonfun$errors$2$$anonfun$apply$5.apply(Helpers.scala:35)
[info]     at views.html.helper.FieldElements$$anonfun$errors$2$$anonfun$apply$5.apply(Helpers.scala:35)
[info]     at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
[info]     at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234)
[info]     at scala.collection.immutable.List.foreach(List.scala:381)
[info]     at scala.collection.TraversableLike$class.map(TraversableLike.scala:234)
[info]     at scala.collection.immutable.List.map(List.scala:285)
[info]     at views.html.helper.FieldElements$$anonfun$errors$2.apply(Helpers.scala:35)
[info]     at views.html.helper.FieldElements$$anonfun$errors$2.apply(Helpers.scala:31)
[info]     at scala.Option.getOrElse(Option.scala:121)
[info]     ...
[info] ScalaTest

在您发布的示例中,您没有训练您的模拟。因此,当您尝试渲染模板时,它试图在模拟上调用
apply
,它将抛出。作为参考,
MessagesApi

正确地训练这个模拟将是非常困难的。相反,您可以构建一个
DefaultMessagesApi
的实例,并将其连接到控制器中:

val config = Configuration(ConfigFactory.load("application.conf")) // Or test.conf, if you have test-specific config files
val messages = new DefaultMessagesApi(Environment.simple(), config, new DefaultLangs(config))
val controller = wire[MyController]

在您发布的示例中,您没有训练您的模拟。因此,当您尝试渲染模板时,它试图在模拟上调用
apply
,它将抛出。作为参考,
MessagesApi

正确地训练这个模拟将是非常困难的。相反,您可以构建一个
DefaultMessagesApi
的实例,并将其连接到控制器中:

val config = Configuration(ConfigFactory.load("application.conf")) // Or test.conf, if you have test-specific config files
val messages = new DefaultMessagesApi(Environment.simple(), config, new DefaultLangs(config))
val controller = wire[MyController]

您的post请求很可能无效我们的post请求很可能无效