2013-11-26 9 views
9

Ich habe versucht, einen Http.Context für Tests zu erstellen, die seinen Konstruktor nicht erfolgreich verwenden. Sieht jemand, was ich falsch mache?play framework 2.2.1: Http.Context für Tests erstellen

Ich habe am folgenden aussehen, aber es gilt nur 2,0 bis Spiele:

Play framework 2.0: Store values in Http.Context

Es sieht aus wie die Klasse für 2.2.1 geändert und es mehr Parameter für den Konstruktor hat, wie hier gezeigt:

https://github.com/playframework/playframework/blob/2.1.x/framework/src/play/src/main/java/play/mvc/Http.java

Das ist mein Code:

import java.util.Map; 
import java.util.Collections; 
import org.junit.*; 
import static org.mockito.Mockito.*; 
import play.mvc.*; 
import play.test.*; 
import play.mvc.Http; 
import play.mvc.Http.Context; 
import play.api.mvc.RequestHeader; 
import static play.test.Helpers.*; 
import static org.fest.assertions.Assertions.*; 


public class TemplateTests { 

    public static FakeApplication app; 
    private final Http.Request request = mock(Http.Request.class); 

    @BeforeClass 
    public static void startApp() { 
     app = Helpers.fakeApplication(); 
     Helpers.start(app); 
    } 

    @Before 
    public void setUp() throws Exception { 
     Map<String, String> flashData = Collections.emptyMap(); 
     Map<String, Object> argData = Collections.emptyMap(); 
     Long id = 2L; 
     play.api.mvc.RequestHeader header = mock(play.api.mvc.RequestHeader.class); 
     Http.Context context = mock(Http.Context(id, header, request , flashData, flashData, argData)); 
     Http.Context.current.set(context); 
    } 


    @Test 
    public void renderTemplate() { 
     Content html = views.html.index.render(); 
     assertThat(contentType(html)).isEqualTo("text/html"); 
     assertThat(contentAsString(html)).contains("myindex"); 
    } 

    @AfterClass 
    public static void stopApp() { 
     Helpers.stop(app); 
    } 
} 

Dies ist der Fehler, den ich sehen werde, wenn ein Test ausgeführt wird:

play test 
[info] Loading project definition from /home/user/solr-segmentexplorer/explorer/project 
[info] Set current project to explorer (in build file:/home/user/solr-segmentexplorer/explorer/) 
[info] Compiling 1 Java source to /home/user/solr-segmentexplorer/explorer/target/scala-2.10/test-classes... 
[error] /home/user/solr-segmentexplorer/explorer/test/TemplateTests.java:33: cannot find symbol 
[error] symbol : method Context(java.lang.Long,play.api.mvc.RequestHeader,play.mvc.Http.Request,java.util.Map<java.lang.String,java.lang.String>,java.util.Map<java.lang.String,java.lang.String>,java.util.Map<java.lang.String,java.lang.Object>) 
[error] location: class play.mvc.Http 
[error]   Http.Context context = mock(Http.Context(id, header, request , flashData, flashData, argData)); 
[error]          ^
[error] 1 error 
[error] (test:compile) javac returned nonzero exit code 
[error] Total time: 3 s, completed Nov 25, 2013 11:56:36 PM 

Irgendwelche Ideen?

Wenn ich nicht einen Kontext schaffen erhalte ich:

[error] Test TemplateTests.renderTemplate failed: java.lang.RuntimeException: There is no HTTP Context available from here.

Antwort

14

Sieht aus wie diese es für mich festgelegt zu haben scheint:

@Before 
public void setUp() throws Exception { 
    Map<String, String> flashData = Collections.emptyMap(); 
    Map<String, Object> argData = Collections.emptyMap(); 
    Long id = 2L; 
    play.api.mvc.RequestHeader header = mock(play.api.mvc.RequestHeader.class); 
    Http.Context context = new Http.Context(id, header, request, flashData, flashData, argData); 
    Http.Context.current.set(context); 
} 

Der Teil, der es speziell fixiert ist:

Http.Context.current.set(context); 
+0

Können Sie näher erläutern, was genau es behoben hat? – Jus12

+0

Der Teil 'Http.Context.current.set (context);' – joerx

+0

Siehe @ Rozuurs Antwort. – PapaSierra

6

Nur um eine Alternative mit Mockito, nur spöttisch genau das, was Sie brauchen (keine manuelle instanziierenden jeder Klasse):

private Http.Context getMockContext() { 
    Http.Request mockRequest = mock(Http.Request.class); 
    when(mockRequest.remoteAddress()).thenReturn("127.0.0.1"); 
    when(mockRequest.getHeader("User-Agent")).thenReturn("mocked user-agent"); 

    // ... and so on. Mock precisely what you need, then add it to your mocked Context 

    Http.Context mockContext = mock(Http.Context.class); 
    when(mockContext.request()).thenReturn(mockRequest); 
    when(mockContext.lang()).thenReturn(Lang.forCode("en")); 

    return mockContext; 
} 

Sie könnten auch überprüfen, ob diese Felder verwendet:

@Test 
public void testMockContext() { 
    final Http.Context mockContext = getMockContext(); 

    assertThat(mockContext.request()).isNotNull(); 
    verify(mockContext).request(); 

    final String remoteAddress = mockContext.request().remoteAddress(); 
    assertThat(remoteAddress).isNotNull(); 
    assertThat(remoteAddress).isEqualTo("127.0.0.1"); 
    verify(mockContext.request()).remoteAddress(); 
} 

Vergessen Sie nicht zu import static org.mockito.Mockito.*

5

Nur Mocking Kontext Klasse löste das Problem

@Before 
public void setUp() throws Exception { 
    Http.Context context = mock(Http.Context.class); 
    Http.Context.current.set(context); 
} 
1

Als Kombination der anderen Antworten:

In build.sbt:

libraryDependencies += "org.mockito" % "mockito-core" % "1.10.19" % "test" 

In Ihrer Testklasse:

import play.mvc.Http; 
import static org.mockito.Mockito.*; 

@Before 
public void setUp() throws Exception { 
    Http.Context context = mock(Http.Context.class); 
    Http.Flash flash = mock(Http.Flash.class); 
    when(context.flash()).thenReturn(flash); 
    Http.Context.current.set(context); 
} 

Wenn Sie mehr benötigen, nur Funktionalitäten Mockito ist. Falls Sie irgendwelche Ausnahmen sehen, überprüfen Sie einfach den kompilierten Code. In meinem Fall war es in target/scala-2.11/twirl/main/views/html/main.template.scala.