在 play.core.j.PlayMagicForJava$.implicitJavaMessages 播放测试 NPE
Play testing NPE at play.core.j.PlayMagicForJava$.implicitJavaMessages
我正在尝试让 Java 测试正常工作。
它应该只测试表单是否正确打开。
我在整个项目中都使用依赖注入。
因此我通过依赖注入创建控制器。
对于表单,我使用 scala.html 视图。在此视图中,使用了 @Messages()
。
如果我理解错误正确,那么这个 Scala Message 调用似乎在我的测试中不起作用。
我必须做什么才能使 scala.html 视图中的 @Messages()
在测试中有效?
错误信息:
[error] Test RegistrationTest.openRegistrationForm failed: java.lang.NullPointerException: null, took 3.718 sec
[error] at play.core.j.PlayMagicForJava$.implicitJavaMessages(TemplateMagicForJava.scala:36)
[error] at views.html.registrationFormView$.apply(registrationFormView.template.scala:44)
[error] at views.html.registrationFormView$.render(registrationFormView.template.scala:79)
[error] at views.html.registrationFormView.render(registrationFormView.template.scala)
[error] at controllers.RegistrationController.registrationForm(RegistrationController.java:46)
[error] at RegistrationTest.openRegistrationForm(RegistrationTest.java:40)
[error] ...
测试class:
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import static play.mvc.Http.Status.OK;
import static play.test.Helpers.contentAsString;
import org.junit.*;
import com.google.common.collect.ImmutableMap;
import controllers.RegistrationController;
import exceptions.message.ResultMessageException;
import play.mvc.*;
import play.test.WithApplication;
public class RegistrationTest
extends WithApplication {
private RegistrationController controller;
@Before
public void setUp() throws Exception {
controller = app.injector()
.instanceOf(RegistrationController.class);
Http.Request mockRequest = new Http.RequestBuilder().remoteAddress("127.0.0.1")
.header("User-Agent", "mocked user-agent")
.build();
Http.Context mockContext = mock(Http.Context.class);
when(mockContext.request()).thenReturn(mockRequest);
Http.Context.current.set(mockContext);
}
@Test
public void openRegistrationForm() {
Result result = null;
try {
result = controller.registrationForm();
} catch (ResultMessageException e) {
result = e.getResult();
}
assertEquals(OK, result.status());
assertEquals("text/html", result.contentType()
.get());
assertEquals("utf-8", result.charset()
.get());
}
}
我的观察是正确的,这个错误是基于 scala.html 视图模板中缺少 @Messages()
实例。
我可以通过将 MessageApi
class 注入测试然后在应用上下文之前模拟 context().messages()
return 值来解决这个问题。
MessagesApi messagesApi = injector.instanceOf(MessagesApi.class);
when(mockContext.messages()).thenReturn(messagesApi.preferred(mockRequest));
Http.Context.current.set(mockContext);
我正在尝试让 Java 测试正常工作。 它应该只测试表单是否正确打开。
我在整个项目中都使用依赖注入。 因此我通过依赖注入创建控制器。
对于表单,我使用 scala.html 视图。在此视图中,使用了 @Messages()
。
如果我理解错误正确,那么这个 Scala Message 调用似乎在我的测试中不起作用。
我必须做什么才能使 scala.html 视图中的 @Messages()
在测试中有效?
错误信息:
[error] Test RegistrationTest.openRegistrationForm failed: java.lang.NullPointerException: null, took 3.718 sec
[error] at play.core.j.PlayMagicForJava$.implicitJavaMessages(TemplateMagicForJava.scala:36)
[error] at views.html.registrationFormView$.apply(registrationFormView.template.scala:44)
[error] at views.html.registrationFormView$.render(registrationFormView.template.scala:79)
[error] at views.html.registrationFormView.render(registrationFormView.template.scala)
[error] at controllers.RegistrationController.registrationForm(RegistrationController.java:46)
[error] at RegistrationTest.openRegistrationForm(RegistrationTest.java:40)
[error] ...
测试class:
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import static play.mvc.Http.Status.OK;
import static play.test.Helpers.contentAsString;
import org.junit.*;
import com.google.common.collect.ImmutableMap;
import controllers.RegistrationController;
import exceptions.message.ResultMessageException;
import play.mvc.*;
import play.test.WithApplication;
public class RegistrationTest
extends WithApplication {
private RegistrationController controller;
@Before
public void setUp() throws Exception {
controller = app.injector()
.instanceOf(RegistrationController.class);
Http.Request mockRequest = new Http.RequestBuilder().remoteAddress("127.0.0.1")
.header("User-Agent", "mocked user-agent")
.build();
Http.Context mockContext = mock(Http.Context.class);
when(mockContext.request()).thenReturn(mockRequest);
Http.Context.current.set(mockContext);
}
@Test
public void openRegistrationForm() {
Result result = null;
try {
result = controller.registrationForm();
} catch (ResultMessageException e) {
result = e.getResult();
}
assertEquals(OK, result.status());
assertEquals("text/html", result.contentType()
.get());
assertEquals("utf-8", result.charset()
.get());
}
}
我的观察是正确的,这个错误是基于 scala.html 视图模板中缺少 @Messages()
实例。
我可以通过将 MessageApi
class 注入测试然后在应用上下文之前模拟 context().messages()
return 值来解决这个问题。
MessagesApi messagesApi = injector.instanceOf(MessagesApi.class);
when(mockContext.messages()).thenReturn(messagesApi.preferred(mockRequest));
Http.Context.current.set(mockContext);