package com.sishuok.mvc.client;
import com.sishuok.mvc.controller.UserRestController;
import com.sishuok.mvc.entity.User;
import com.sishuok.mvc.service.UserService;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.mockito.Mockito;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory;
import org.springframework.boot.context.embedded.jetty.JettyEmbeddedServletContainerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.*;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter;
import java.util.Arrays;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.beans.HasPropertyWithValue.hasProperty;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
/**
* <p>User: Zhang Kaitao
* <p>Date: 13-12-29
* <p>Version: 1.0
*/
public class SpringBootClientTest extends AbstractClientTest {
private static ApplicationContext ctx;
@BeforeClass
public static void beforeClass() throws Exception {
ctx = SpringApplication.run(Config.class); //启动服务器 加载Config指定的组件
}
@AfterClass
public static void afterClass() throws Exception {
SpringApplication.exit(ctx);//退出服务器
}
@Test
public void testFindById() throws Exception {
ResponseEntity<User> entity = restTemplate.getForEntity(baseUri + "/{id}", User.class, 1L);
assertEquals(HttpStatus.OK, entity.getStatusCode());
assertThat(entity.getHeaders().getContentType().toString(), containsString(MediaType.APPLICATION_JSON_VALUE));
assertThat(entity.getBody(), hasProperty("name", is("zhang")));
}
@Test
public void testSaveWithJson() throws Exception {
User user = new User();
user.setId(1L);
user.setName("zhang");
String uri = baseUri;
String createdLocation = baseUri + "/" + 1;
restTemplate.setMessageConverters(Arrays.<HttpMessageConverter<?>>asList(new MappingJackson2HttpMessageConverter()));
ResponseEntity<User> responseEntity = restTemplate.postForEntity(uri, user, User.class);
assertEquals(createdLocation, responseEntity.getHeaders().get("Location").get(0));
assertEquals(HttpStatus.CREATED, responseEntity.getStatusCode());
assertEquals(user, responseEntity.getBody());
}
@Test
public void testSaveWithXML() throws Exception {
User user = new User();
user.setId(1L);
user.setName("zhang");
String uri = baseUri;
String createdLocation = baseUri + "/" + 1;
restTemplate.setMessageConverters(Arrays.<HttpMessageConverter<?>>asList(new Jaxb2RootElementHttpMessageConverter()));
ResponseEntity<User> responseEntity = restTemplate.postForEntity(uri, user, User.class);
assertEquals(createdLocation, responseEntity.getHeaders().get("Location").get(0));
assertEquals(HttpStatus.CREATED, responseEntity.getStatusCode());
assertEquals(user, responseEntity.getBody());
}
@Test
public void testUpdate() throws Exception {
User user = new User();
user.setId(1L);
user.setName("zhang");
String uri = baseUri + "/{id}";
restTemplate.setMessageConverters(Arrays.<HttpMessageConverter<?>>asList(new MappingJackson2HttpMessageConverter()));
ResponseEntity responseEntity = restTemplate.exchange(uri, HttpMethod.PUT, new HttpEntity<>(user), (Class) null, user.getId());
assertEquals(HttpStatus.NO_CONTENT, responseEntity.getStatusCode());
}
@Test
public void testDelete() throws Exception {
String uri = baseUri + "/{id}";
Long id = 1L;
ResponseEntity responseEntity = restTemplate.exchange(uri, HttpMethod.DELETE, HttpEntity.EMPTY, (Class) null, id);
assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
}
@Configuration
@EnableAutoConfiguration
static class Config {
@Bean
public EmbeddedServletContainerFactory servletContainer() {
return new JettyEmbeddedServletContainerFactory();
}
@Bean
public UserRestController userController() {
return new UserRestController(userService());
}
@Bean
public UserService userService() {
//Mockito请参考 http://stamen.iteye.com/blog/1470066
UserService userService = Mockito.mock(UserService.class);
User user = new User();
user.setId(1L);
user.setName("zhang");
Mockito.when(userService.findById(Mockito.any(Long.class))).thenReturn(user);
return userService;
// return new UserServiceImpl(); //此处也可以返回真实的UserService实现
}
}
}