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
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请求很可能无效