0

Ich versuche, einen Java-Test zu arbeiten. Es sollte nur getestet werden, wenn ein Formular korrekt geöffnet wird.

Ich verwende Abhängigkeitsinjektion durch mein Projekt. Deshalb erstelle ich den Controller über die Abhängigkeitsinjektion.

Für das Formular verwende ich eine scala.html Ansicht. In dieser Ansicht wird @Messages() verwendet. Wenn ich den Fehler richtig verstehe, scheint es, dass dieser Scala-Message-Aufruf in meinem Test nicht funktioniert.

Was muss ich tun, damit @Messages() in scala.html Ansichten in Tests funktioniert?

Fehlermeldung:

[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]  ... 

Prüfklasse:

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()); 
    } 
} 

Antwort

0

Ich hatte recht mit meiner Beobachtung, dass dieser Fehler auf einem fehlenden @Messages() Beispiel in den scala.html Ansicht Vorlagen basiert.

Ich konnte dieses Problem lösen, indem Sie die MessageApi Klasse in den Test injizieren und dann den context().messages() Rückgabewert vor dem Anwenden des Kontexts mockten.

MessagesApi messagesApi = injector.instanceOf(MessagesApi.class); 
when(mockContext.messages()).thenReturn(messagesApi.preferred(mockRequest)); 

Http.Context.current.set(mockContext);