在 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);