【问题标题】:Play framework 2.2.1: Create Http.Context for tests玩框架2.2.1:创建Http.Context进行测试
【发布时间】:2013-11-26 00:24:14
【问题描述】:

我一直在尝试使用其构造函数创建一个用于测试的 Http.Context,但未成功。有人看到我做错了吗?

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

Play framework 2.0: Store values in 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<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);
    }
}

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

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

有什么想法吗?

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

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

【问题讨论】:

    标签: java unit-testing playframework playframework-2.2


    【解决方案1】:

    看起来这似乎已经为我解决了:

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

    具体修复的部分是:

    Http.Context.current.set(context);
    

    【讨论】:

    • 您能否详细说明究竟是什么修复了它?
    • 部分Http.Context.current.set(context);
    • 查看@Rozuur 的回答。
    • @PapaSierra 而你否决了我的回答?因为你更喜欢那个?
    • @PapaSierra 检查我对答案的额外说明
    【解决方案2】:

    只是为了提供使用 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;
    }
    

    您还可以验证这些字段是否已被使用:

    @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.*

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        作为其他答案的组合:

        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 的功能。如果您看到任何异常,只需检查编译的代码。就我而言,它位于target/scala-2.11/twirl/main/views/html/main.template.scala

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-10-15
          • 2018-08-14
          • 2013-05-18
          • 1970-01-01
          • 2012-07-28
          • 1970-01-01
          • 2017-11-29
          相关资源
          最近更新 更多