Play framework 2.2.1: Create Http.Context for tests

后端 未结 4 1348
半阙折子戏
半阙折子戏 2020-12-29 10:35

I\'ve been trying to create an Http.Context for tests using its constructor unsuccessfully. Does anybody see what I\'m doing wrong?

I\'ve looked at the following but

相关标签:
4条回答
  • 2020-12-29 10:46

    Looks like this seems to have fixed it for me:

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

    The part that fixes it specifically is:

    Http.Context.current.set(context);
    
    0 讨论(0)
  • 2020-12-29 10:47

    Just mocking context class solved the issue

    @Before
    public void setUp() throws Exception {
        Http.Context context = mock(Http.Context.class);
        Http.Context.current.set(context);
    }
    
    0 讨论(0)
  • 2020-12-29 11:01

    As a combination of the other answers:

    In build.sbt:

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

    In your test class:

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

    If you need more, just Mockito's functionalities. In case you are seeing any exceptions, just inspect the compiled code. IN my case, it was in target/scala-2.11/twirl/main/views/html/main.template.scala.

    0 讨论(0)
  • 2020-12-29 11:03

    Just to provide an alternative using Mockito, only mocking just what you need (no manual instantiating of any class):

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

    You could also verify if those fields have been used:

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

    Don't forget to import static org.mockito.Mockito.*

    0 讨论(0)
提交回复
热议问题