title: MocMVC giving HttpMessageNotReadableException
body: <p>I'm still learning my way around testing and I'm trying to get a MockMvc test to work for me. It's a simple REST controller that at this point is only doing some authentication using information from json in the post. I've actually implemented the code, so I know it's working because I get back both the correct response with the correct input and the error messages I've put together, both in a json format. My problem is that the test keeps failing with a HttpMessageNotReadableException, even though the actual code works, so I'm assuming I don't have my test set up right. Any help you guys can give would be great. </p>
  
  <p>Here's my controller</p>
  
  <pre><code>@Controller
  public class RequestPaymentController {
  protected final Log logger = LogFactory.getLog(getClass());
  private PaymentService paymentService;
  private LoginService loginService;
  
  @Autowired
  public void setPaymentService(PaymentService paymentService){
      this.paymentService =  paymentService;
  }
  @Autowired
  public void setLoginService(LoginService loginService){
      this.loginService =  loginService;
  }
  
  @RequestMapping(value = "/requestpayment", method = RequestMethod.POST, headers="Accept=application/json")
  @ResponseBody
  public ResponseEntity&lt;PaymentResult&gt; handleRequestPayment(@RequestBody PaymentRequest paymentRequest, HttpServletRequest request, HttpServletResponse response, BindingResult result) throws Exception{
      ResponseEntity&lt;PaymentResult&gt; responseEntity = null;
      new LoginValidator().validate(paymentRequest, result);
      boolean valid = loginService.isLoginValid(paymentRequest, result);
      if (valid){
        responseEntity = setValidResponse(paymentRequest);
      }else {
          throw new TumsException("exception message");
  
      }
      return responseEntity;
  }
  
  
  private ResponseEntity&lt;PaymentResult&gt; setValidResponse(PaymentRequest paymentRequest){
      PaymentResult paymentResult = paymentService.getResults(paymentRequest);
  
      return new ResponseEntity&lt;PaymentResult&gt;(paymentResult, HttpStatus.OK);
  }
  
  
  }
  </code></pre>
  
  <p>And here's my test code:</p>
  
  <pre><code>public class RequestPaymentControllerTest {
  
  PaymentService mockPaymentService;
  RequestPaymentController requestPaymentController;
  HttpServletRequest mockHttpServletRequest;
  HttpServletResponse mockHttpServletResponse;
  PaymentRequest mockPaymentRequest;
  BindingResult mockBindingResult;
  LoginService mockLoginService;
  PaymentResult mockPaymentResult;
  MockMvc mockMvc;
  
  
  @Before
  public void setUp() throws Exception {
      mockPaymentService = createMock(PaymentService.class);
      mockHttpServletRequest = createMock(HttpServletRequest.class);
      mockHttpServletResponse = createMock(HttpServletResponse.class);
      mockPaymentRequest = createMock(PaymentRequest.class);
      requestPaymentController = new RequestPaymentController();
      mockBindingResult = createMock(BindingResult.class);
      mockLoginService = createMock(LoginService.class);
      requestPaymentController.setPaymentService(mockPaymentService);
      mockPaymentResult = createMock(PaymentResult.class);
      mockMvc = MockMvcBuilders.standaloneSetup(new RequestPaymentController()).build();
  
  }
  
  @After
  public void tearDown() throws Exception {
      mockPaymentService = null;
      mockHttpServletRequest = null;
      mockHttpServletResponse = null;
      mockPaymentRequest = null;
      requestPaymentController = null;
      mockBindingResult = null;
      mockLoginService = null;
      mockPaymentResult = null;
      mockMvc = null;
  }
  
  
  @Test
  public void testHandleRequestPayment() throws Exception{
      initializeStateForHandleRequestPayment();
      createExpectationsForHandleRequestPayment();
      replayAndVerifyExpectationsForHandleRequestPayment();
  
  }
  
  
  
  private void initializeStateForHandleRequestPayment(){
  
  }
  
  private void createExpectationsForHandleRequestPayment(){
      mockPaymentRequest.getServiceUsername();
      expectLastCall().andReturn("testuser");
      mockPaymentRequest.getServicePassword();
      expectLastCall().andReturn("password1!");
      mockLoginService.isLoginValid(mockPaymentRequest,mockBindingResult);
      expectLastCall().andReturn(true);
      mockPaymentService.getResults(mockPaymentRequest);
      expectLastCall().andReturn(mockPaymentResult);
  }
  
  private void replayAndVerifyExpectationsForHandleRequestPayment() throws Exception{
      replay(mockPaymentService, mockBindingResult, mockHttpServletRequest, mockHttpServletResponse, mockPaymentRequest, mockLoginService);
      requestPaymentController.setLoginService(mockLoginService);
      requestPaymentController.handleRequestPayment(mockPaymentRequest, mockHttpServletRequest, mockHttpServletResponse, mockBindingResult);
      mockMvc.perform(post("/requestpayment")
              .contentType(MediaType.APPLICATION_JSON)
              .accept(MediaType.APPLICATION_JSON))
              .andDo(print())
              .andExpect(status().isBadRequest());
      verify(mockPaymentService, mockBindingResult, mockHttpServletRequest, mockHttpServletResponse, mockPaymentRequest, mockLoginService);
  
  }
  }
  </code></pre>
  
  <p>The results of the andDo(print()) are:</p>
  
  <pre><code>MockHttpServletRequest:
       HTTP Method = POST
       Request URI = /requestpayment
        Parameters = {}
           Headers = {Content-Type=[application/json], Accept=[application/json]}
  
           Handler:
              Type = portal.echecks.controller.RequestPaymentController
            Method = public org.springframework.http.ResponseEntity&lt;portal.echecks.model.PaymentResult&gt; portal.echecks.controller.RequestPaymentController.handleRequestPayment(portal.echecks.model.PaymentRequest,javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse,org.springframework.validation.BindingResult) throws java.lang.Exception
  
    Resolved Exception:
              Type = org.springframework.http.converter.HttpMessageNotReadableException
  
      ModelAndView:
         View name = null
              View = null
             Model = null
  
          FlashMap:
  
  MockHttpServletResponse:
            Status = 400
     Error message = null
           Headers = {}
      Content type = null
              Body = 
     Forwarded URL = null
    Redirected URL = null
           Cookies = []
  
  Process finished with exit code 0
  </code></pre>
  
  <p>As you can see, the test passes when I'm expecting a bad request status, but I've put in logging and I know that the ResponseBody I'm sending back has a 200 status. Like I said, this is my first time with MockMvc, so I assume I've not set something up right. Any suggestions? </p>