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

Popular posts from this blog

c# - Update a combobox from a presenter (MVP) -

How to understand 2 main() functions after using uftrace to profile the C++ program? -

How to put a lock and transaction on table using spring 4 or above using jdbcTemplate and annotations like @Transactional? -