Junit using SpringbootTest - salmanbaig8/imp GitHub Wiki
import static org.springframework.test.web.client.match.MockRestRequestMatchers.method; import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo; import static org.springframework.test.web.client.response.MockRestResponseCreators.withStatus;
@ActiveProfiles("test") @RunWith(SpringRunner.class) @SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class ControllerTest { @Autowired private WebApplicationContext webApplicationContext; @LocalServerPort private int port; private MockRestServiceServer mockServer; private MockMvc mockMvc; private MvcResult result; HttpHeaders headers = new HttpHeaders(); RestTemplate restTemplate = new RestTemplate(); ObjectMapper mapper = new ObjectMapper(); HttpEntity entity = new HttpEntity<>(ObjectModel, headers); ResponseEntity response = null; String expected = null; String url = null; Map<String, Object> m1; Map<String, Object> m2;
@Before
public void setUp() throws Exception {
mockServer = MockRestServiceServer.createServer(restTemplate);
headers.set("Accept", MediaType.APPLICATION_JSON_VALUE);
headers.setContentType(MediaType.APPLICATION_JSON);
}
@Test
public void testMethod() {
url = "/API/fetch";
expected = json Response String;
mockServer(url, expected);
response = responseEntity(url, entity);
AssertApi(expected, response);
}
private String createURLWithPort(String uri) throws UnknownHostException {
String localhost = InetAddress.getLocalHost().getHostAddress();
return "http://" + localhost + ":" + port + uri;
}
private void mockServer(String url, String expected) {
try {
mockServer
.expect(ExpectedCount.once(),
requestTo(new URI(createURLWithPort(url))))
.andExpect(method(HttpMethod.PUT))
.andRespond(
withStatus(HttpStatus.OK).contentType(
MediaType.APPLICATION_JSON).body(expected));
} catch (UnknownHostException | URISyntaxException e) {
logger.error(e.getMessage(), e.getCause());
}
}
private ResponseEntity<ObjectResponse> responseEntity(String url, HttpEntity<ObjectModel> entity) {
try {
response = restTemplate
.exchange(
createURLWithPort(url),
HttpMethod.PUT, entity,
ObjectResponse.class);
} catch (RestClientException | UnknownHostException e) {
logger.error(e.getMessage(), e.getCause());
}
return response;
}
@SuppressWarnings("unchecked")
private void AssertApi(String expected, ResponseEntity<ObjectResponse> response){
try {
m1 = (mapper.readValue(expected, Map.class));
m2 = (mapper.readValue(mapper.writeValueAsString(response.getBody()), Map.class));
logger.debug("Response Body:" + mapper.writeValueAsString(response.getBody()) + "Response Headers: " + response.getHeaders() + "Response Status: " + response.getStatusCode());
} catch (IOException e) {
logger.error(e.getMessage(), e.getCause());
}
Assert.assertEquals(m1, m2);
}
@Test
public void testUploadFile() throws Exception {
url = "API/upload";
String file = "C:/Users/Public/Pictures/Sample Pictures/Desert.jpg";
String fileName = "TestUpload.jpg";
ResourceLoader resourceLoader = new DefaultResourceLoader();
Resource resource = resourceLoader.getResource("file:"+ file);
MockMultipartFile firstFile = new MockMultipartFile("uploadFile", fileName , "text/plain", resource.getInputStream());
MockMultipartFile jsonFile = new MockMultipartFile("ObjectModel", "", "application/json", mapper.writeValueAsBytes(ObjectModel));
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
mockMvc.perform(MockMvcRequestBuilders.fileUpload(createURLWithPort(url))
.file(firstFile)
.file(jsonFile)
.content("success"));
}
@Test
public void testDownload() {
url = "/API/download";
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
try {
result = mockMvc.perform(MockMvcRequestBuilders.post(createURLWithPort(url))
.content(mapper.writeValueAsString(ObjectModel))
.contentType(MediaType.APPLICATION_JSON))
.andExpect(MockMvcResultMatchers.status().is(200)).andReturn();
logger.debug("File Length: " + result.getResponse().getContentAsByteArray().length);
Assert.assertEquals(200, result.getResponse().getStatus());
logger.debug(result.getResponse().getContentAsByteArray().length);
Assert.assertEquals(845941, result.getResponse().getContentAsByteArray().length);
Assert.assertEquals(MediaType.APPLICATION_OCTET_STREAM_VALUE, result.getResponse().getContentType());
Different approach
// DefaultMockMvcBuilder defualtBuilder = MockMvcBuilders.webAppContextSetup(this.webApplicationContext);
// this.mockMvc = defualtBuilder.build();
//
// ResultMatcher ok = MockMvcResultMatchers.status().isOk();
// try {
// MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.post(createURLWithPort(url))
// .contentType(MediaType.APPLICATION_JSON_VALUE)
// .content(mapper.writeValueAsString(ObjectModel));
//
// result = this.mockMvc.perform(builder)
// .andExpect(ok)
// .andReturn();
#########################################
// TO Print the byte Array
// this.mockMvc.perform(builder)
// .andExpect(ok)
// .andDo(MockMvcResultHandlers.print());
//
}