In the previous post entitled "Unit testing Spring MVC controllers for web and RESTful services with spring-test-mvc" I covered examples for an HTTP get. In this post, I will show an example of testing an HTTP POST that takes "JSON data" as the body. Here is the code snippet. |
public class MyAppControllerTest {
private MyAppService mockMyAppService;
private MyAppController controller;
@Before
public void setup() {
controller = new MyAppController();
mockMyAppService = mock(MyAppServiceImpl.class);
controller.setMyAppService(mockMyAppService);
}
@Test
public void testAddOrModifyAdjustment() throws Exception {
//mock the service call within the controller.
when(mockMyAppService.addOrModifyAdjustment((MyAppDetail) Mockito.any())).thenReturn(getMyAppDetail());
standaloneSetup(controller)
.build()
.perform(
MockMvcRequestBuilders.post("/addOrModifyAdjustment").contentType(MediaType.APPLICATION_JSON)
.body(getAdjustmentDetailJsonString().getBytes()).accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk()).andExpect(content().type("application/json"))
.andExpect(jsonPath("MyAppId").value(874))
.andExpect(jsonPath("MyAppDetailId").value(48515))
.andExpect(jsonPath("portfolioCd").value("3927"))
.andExpect(jsonPath("txnCd").value("ADJUSTMNT"))
.andExpect(jsonPath("txnTypeCd").value("59"))
.andExpect(jsonPath("txnTypeDesc").value("PURCHASE"))
.andExpect(jsonPath("cashValue").value(1100000.02))
.andExpect(jsonPath("sourceUnits").value(200.00))
}
private String getAdjustmentDetailJsonString(){
String jsonStr =
"{\r\n" +
" \"MyAppId\":874,\r\n" +
" \"MyAppDetailId\":48515,\r\n" +
" \"portfolioCd\": \"3927\",\r\n" +
" \"currencyCd\": \"AUD\",\r\n" +
" \"accountCd\": \"CURR-AUD\",\r\n" +
" \"txnCd\":\"ADJUSTMNT\",\r\n" +
" \"txnTypeCd\":\"59\",\r\n" +
" \"txnTypeDesc\":\"PURCHASE\",\r\n" +
" \"cashValue\": 1100000.02000000,\r\n" +
" \"sourceUnits\":200.00,\r\n" +
"}";
return jsonStr;
}
private MyAppDetail getMyAppDetail() {
MyAppDetail cfDetail = new MyAppDetail();
cfDetail.setMyAppId(BigInteger.valueOf(874));
cfDetail.setMyAppDetailId(BigInteger.valueOf(48515));
cfDetail.setPortfolioCd("3927");
cfDetail.setTxnCd("ADJUSTMNT");
cfDetail.setTxnTypeCd("59");
cfDetail.setTxnTypeDesc("PURCHASE");
cfDetail.setPositionIndicator("OUT");
return cfDetail;
}
}
The actual Spring MVC controller that is being tested will be defined as
@Controller
public class MyAppController {
@Resource(name = "myAppService")
private MyAppService myAppService;
private static final Logger logger = LoggerFactory.getLogger(CashForecastController.class);
@RequestMapping(value = "/addOrModifyAdjustment", method = RequestMethod.POST, headers="Accept=application/json")
public @ResponseBody MyAppDetail addOrModifyAdjustment(@RequestBody MyAppDetail adjDetail) throws Exception
{
logger.info("adjustMyAppDetail cfDetail={}, MyApp={}", new Object[] {adjDetail});
MyAppDetail addOrModifyAdjustment = myAppService.addOrModifyAdjustment(adjDetail);
return addOrModifyAdjustment;
}
}