java - Inject mock HttpServletResponse during unit testing -
question first: how can inject mock (or real?) httpservletresponse during unit tests cxf jax-rs service endpoints?
example of how our services setup (note have no control/authority alter non-test structures):
package services.example; import org.springframework.http.mediatype; import javax.servlet.http.httpservletresponse; import javax.ws.rs.get; import javax.ws.rs.post; import javax.ws.rs.put; import javax.ws.rs.path; import javax.ws.rs.pathparam; import javax.ws.rs.produces; import javax.ws.rs.core.context; @restcontroller @path("/base") @produces(mediatype.application_json_value); public class exampleservice { @autowired someinjectedservice injectedservice; @post @path("/endpoint") public object testendpoint(object exampleinput, @context httpservletresponse response) { if (exampleinput.somemethod != null) { // exception thrown here during tests, response null!!! response.setstatus(301); return exampleinput; } return new injectedservice.returnoutputfrominput(exampleinput); } } test class:
package test.services.example // gazillion imports. mockito, junit, hamcrest, javax.ws.rs, org.apache.cxf, jackson providers. public class testexampleservice { @mock private httpservletresponse mockresponse; // should this? @mock someinjectedservice mockinjectionservice; @injectmocks exampleservice service = new exampleservice(); @before public void setupstuff() { mockitoannotations.initmocks(this); jaxrsserverfactorybean sf = new jaxrsserverfactorybean(); sf.setresourceclasses(exampleservice.class); list<object> providers = new arraylist<object>; jacksonjsonprovider provider = new jacksonjsonprovider(); providers.add(provider); sf.setproviders(providers); sf.setresourceprovider(exampleservice.class, new singletonresourceprovider(service, true)); sf.setaddress("local://someuri"); // i'm trying set injected response context. help? sf.setinvoker(new invoker() { invoker jarsinvoker = new jaxrsinvoker(); @override public object invoke(exchange exchange, object o) { // goes in here? i've seen example setting mock // request context, no response. here's current // (broken) attempt this... exchange.getinmessage().put(abstracthttpdestination.http_response, mockresponse); return jarsinvoker.invoke(exchange, o); } }); } @test public void testendpointshouldreturn301() { list<object> providers = new arraylist<object>(); jacksonjaxbjsonprovider provider = new jacksonjaxbjsonprovider(); providers.add(provider); webclient client = webclient.create("local://someuri", providers); webclient.getconfig(client) .getrequestcontext() .put(localconduit.direct_dispatch, boolean.true); // exception thrown here, response context doesn't injected! client.path("/base/endpoint"); sometestobject obj = new sometestobject(); response response = client.type(mediatype.application_json).post(obj); // never gets run because exception thrown :( assertthat(response.getstatus(), is(301)); } } it's possible i'm doing couple things wrong here, i'm hoping need right "magic" going in inside custom invoker in order inject httpservletresponse endpoint. i'll note on endpoints not have injected context, tests work correctly (when remove custom invoker bit).
you don't have initialize example service constructor, keep this:
@injectmocks exampleservice service; if want test @path("/endpoint"), it's right do weird. if want test code, this:
@test public void testendpointshouldreturn301() { service.testendpoint(someobject, mockresponse); assertthat(response.getstatus(), is(301)); }
Comments
Post a Comment