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
Post a Comment