java - how to mock a servletContext instead of Servlet or HttpServletRequest? -


i have independent project writing test cases; problem can't mock httpservletrequest, because in servlet there calls getservletcontext() test cases running outside servlet container. return error saying "no context found". 1 dependency servlet container; there can hundreds. example, initialcontext.lookup() depends on container.

how can use mockito write test case in scenario? please don't ask error message; it's more of logical problem technical.

looking on internet tutorials makes me wonder if doing wrong. no 1 seems have encountered problem before... how can mock httpservletrequest without ever having getservletcontext() called in servlet? mean seriously, how rare can be?

you have servlet implementation uses servletcontext, e.g.

public class someservlet extends httpservlet{      protected void doget(httpservletrequest req, httpservletresponse resp) throws servletexception, ioexception {         servletcontext servletcontext = getservletcontext();         object attribute = servletcontext.getattribute("test");         system.out.println(attribute.tostring());    } } 

in case have 2 options test doget method

use powermock's partitial mocking mock getservletcontext method.

@runwith(powermockrunner.class) public class someservlettest {      @test     public void onget() throws servletexception, ioexception{         someservlet someservlet = powermock.createpartialmock(someservlet.class, "getservletcontext");            servletcontext servletcontext = powermock.createnicemock(servletcontext.class);         httpservletrequest httpservletrequest = powermock.createnicemock(httpservletrequest.class);         httpservletresponse httpservletresponse = powermock.createnicemock(httpservletresponse.class);          someservlet.getservletcontext();         powermock.expectlastcall().andreturn(servletcontext);          servletcontext.getattribute("test");         powermock.expectlastcall().andreturn("hello");          powermock.replay(someservlet, servletcontext, httpservletrequest, httpservletresponse);          someservlet.doget(httpservletrequest, httpservletresponse);     } } 

or simpler way override getservletcontext method. in case don't need powermock. can using easymock. e.g.

public class someservlettest {      @test     public void onget() throws servletexception, ioexception{         httpservletrequest httpservletrequest = easymock.createnicemock(httpservletrequest.class);         httpservletresponse httpservletresponse = easymock.createnicemock(httpservletresponse.class);         final servletcontext servletcontext = easymock.createnicemock(servletcontext.class);         someservlet someservlet = new someservlet(){             public servletcontext getservletcontext() {                 return servletcontext; // return mock             }         };          easymock.expect(servletcontext.getattribute("test")).andreturn("hello");         easymock.replay(servletcontext, httpservletrequest, httpservletresponse);          someservlet.doget(httpservletrequest, httpservletresponse);     } } 

there can 100's. initialcontext.lookup() dependent on container.

in case can either create initialcontext mock , use this. if code creates new initialcontext, e.g.

public void somemethod(){     initialcontext context = new initialcontext();     context.lookup(....); } 

you can extract initialcontext instantiation protected method can override in tests showed above servletcontext

public void somemethod(){     initialcontext context = createinitialcontext();     context.lookup(....); }  protected initialcontext createinitialcontext(){     return new initialcontext(); // can overridden subclass                                   // , therefore tests                                  // return mock } 

if don't want or can't modify code in way, can use powermock intercept constructor.

edit

can post mockito code? pleasure, since methods named differently.

@test public void onget() throws servletexception, ioexception {   httpservletrequest httpservletrequest = mockito.mock(httpservletrequest.class);   httpservletresponse httpservletresponse = mockito.mock(httpservletresponse.class);   final servletcontext servletcontext = mockito.mock(servletcontext.class);   someservlet someservlet = new someservlet(){     public servletcontext getservletcontext() {       return servletcontext; // return mock     }   };    mockito.doreturn("hello").when(servletcontext).getattribute("test");    someservlet.doget(httpservletrequest, httpservletresponse); } 

Comments

Popular posts from this blog

android - Get AccessToken using signpost OAuth without opening a browser (Two legged Oauth) -

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: mockito -

google shop client API returns 400 bad request error while adding an item -