package com.github.zhangkaitao.proto; import com.github.zhangkaitao.pb.UserProtos; import com.github.zhangkaitao.web.controller.MyExtensionRegistryInitializer; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.webapp.WebAppContext; import org.junit.*; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.*; import org.springframework.http.converter.protobuf.ExtensionRegistryInitializer; import org.springframework.http.converter.protobuf.ProtobufHttpMessageConverter; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockServletContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.web.client.MockRestServiceServer; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MockMvcBuilder; import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.RequestBuilder; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.request.RequestPostProcessor; import org.springframework.test.web.servlet.setup.ConfigurableMockMvcBuilder; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.test.web.servlet.setup.MockMvcConfigurer; import org.springframework.web.client.RestTemplate; import org.springframework.web.context.WebApplicationContext; import java.net.URI; import static org.springframework.test.web.client.MockRestServiceServer.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.setup.MockMvcBuilders.*; import static org.springframework.test.web.client.match.MockRestRequestMatchers.*; import static org.springframework.test.web.client.response.MockRestResponseCreators.*; /** * User: zhangkaitao * Date: 14-8-5 * Time: ����8:48 * Version: 1.0 */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(value = "classpath:spring-mvc.xml") @WebAppConfiguration public class ProtoTest2 { @Autowired private WebApplicationContext context; MockMvc mockMvc; MockRestServiceServer mockRestServiceServer; RestTemplate restTemplate; @Before public void setup() throws Exception { mockMvc = webAppContextSetup(context).apply(defaultSetup()).build(); restTemplate = new RestTemplate(); ExtensionRegistryInitializer extensionRegistryInitializer = new MyExtensionRegistryInitializer(); ProtobufHttpMessageConverter protobufHttpMessageConverter = new ProtobufHttpMessageConverter(extensionRegistryInitializer); restTemplate.getMessageConverters().add(0, protobufHttpMessageConverter); mockRestServiceServer = createServer(restTemplate); } private MockMvcConfigurer defaultSetup() { return new MockMvcConfigurer() { @Override public void afterConfigurerAdded(ConfigurableMockMvcBuilder<?> configurableMockMvcBuilder) { configurableMockMvcBuilder.alwaysExpect(status().isOk()); } @Override public RequestPostProcessor beforeMockMvcCreated(ConfigurableMockMvcBuilder<?> configurableMockMvcBuilder, WebApplicationContext webApplicationContext) { return new RequestPostProcessor() { @Override public MockHttpServletRequest postProcessRequest(MockHttpServletRequest mockHttpServletRequest) { mockHttpServletRequest.setAttribute("aa", "aa"); return mockHttpServletRequest; } }; } }; } @Test public void testRead() throws Exception { MvcResult mvcResult = mockMvc.perform(get("/proto/read")).andReturn(); Assert.assertEquals("aa", mvcResult.getRequest().getAttribute("aa")); String response = mvcResult.getResponse().getContentAsString(); mockRestServiceServer .expect(requestTo("/proto/read")) .andExpect(method(HttpMethod.POST)) .andRespond(withSuccess(response, ProtobufHttpMessageConverter.PROTOBUF)); HttpHeaders headers = new HttpHeaders(); RequestEntity<UserProtos.User> requestEntity = new RequestEntity<UserProtos.User>(headers, HttpMethod.POST, URI.create("/proto/read")); ResponseEntity<UserProtos.User> responseEntity = restTemplate.exchange(requestEntity, UserProtos.User.class); System.out.println(responseEntity.getBody()); } }