Play framework 2.2.1:为测试创建Http.Context

我一直在尝试使用其构造函数为测试创建一个Http.Context失败。 有人看到我做错了吗?

我看过以下内容,但它仅适用于Play 2.0:

Play framework 2.0:将值存储在Http.Context中

看起来类更改为2.2.1,它有更多的构造函数参数,如下所示:

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

这是我的代码:

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 flashData = Collections.emptyMap(); Map 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); } } 

这是我在运行测试时看到的错误:

 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.util.Map,java.util.Map) [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 

有任何想法吗?

如果我不创建上下文,我得到:

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

看起来这似乎已经为我修好了:

 @Before public void setUp() throws Exception { Map flashData = Collections.emptyMap(); Map 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); } 

具体修复它的部分是:

 Http.Context.current.set(context); 

只是为了使用Mockito提供替代方案,只模拟你需要的东西(没有手动实例化任何类):

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

您还可以validation是否已使用这些字段:

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

不要忘记import static org.mockito.Mockito.*

只是模拟上下文类解决了这个问题

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

作为其他答案的组合:

build.sbt

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

在您的测试类中:

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

如果您需要更多,只需Mockito的function。 如果您看到任何exception,只需检查已编译的代码。 就我而言,它位于target/scala-2.11/twirl/main/views/html/main.template.scala