5 changed files with 200 additions and 8 deletions
@ -0,0 +1,93 @@
@@ -0,0 +1,93 @@
|
||||
/* |
||||
* Copyright 2002-2012 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
package org.springframework.test.web.client; |
||||
|
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.request; |
||||
|
||||
import java.io.IOException; |
||||
import java.net.URI; |
||||
import java.util.List; |
||||
|
||||
import org.springframework.http.HttpHeaders; |
||||
import org.springframework.http.HttpMethod; |
||||
import org.springframework.http.HttpStatus; |
||||
import org.springframework.http.client.ClientHttpRequest; |
||||
import org.springframework.http.client.ClientHttpRequestFactory; |
||||
import org.springframework.http.client.ClientHttpResponse; |
||||
import org.springframework.mock.http.client.MockClientHttpRequest; |
||||
import org.springframework.mock.http.client.MockClientHttpResponse; |
||||
import org.springframework.mock.web.MockHttpServletResponse; |
||||
import org.springframework.test.web.servlet.MockMvc; |
||||
import org.springframework.test.web.servlet.MvcResult; |
||||
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; |
||||
|
||||
/** |
||||
* A {@link ClientHttpRequestFactory} for requests executed via {@link MockMvc}. |
||||
* |
||||
* @author Rossen Stoyanchev |
||||
* @since 3.2 |
||||
*/ |
||||
public class MockMvcClientHttpRequestFactory implements ClientHttpRequestFactory { |
||||
|
||||
private final MockMvc mockMvc; |
||||
|
||||
|
||||
public MockMvcClientHttpRequestFactory(MockMvc mockMvc) { |
||||
this.mockMvc = mockMvc; |
||||
} |
||||
|
||||
public ClientHttpRequest createRequest(final URI uri, final HttpMethod httpMethod) throws IOException { |
||||
return new MockClientHttpRequest(httpMethod, uri) { |
||||
|
||||
@Override |
||||
public ClientHttpResponse executeInternal() throws IOException { |
||||
try { |
||||
MockHttpServletRequestBuilder requestBuilder = request(httpMethod, uri.toString()); |
||||
requestBuilder.content(getBodyAsBytes()); |
||||
requestBuilder.headers(getHeaders()); |
||||
|
||||
MvcResult mvcResult = MockMvcClientHttpRequestFactory.this.mockMvc.perform(requestBuilder).andReturn(); |
||||
|
||||
MockHttpServletResponse servletResponse = mvcResult.getResponse(); |
||||
HttpStatus status = HttpStatus.valueOf(servletResponse.getStatus()); |
||||
byte[] body = servletResponse.getContentAsByteArray(); |
||||
HttpHeaders headers = getResponseHeaders(servletResponse); |
||||
|
||||
MockClientHttpResponse clientResponse = new MockClientHttpResponse(body, status); |
||||
clientResponse.getHeaders().putAll(headers); |
||||
|
||||
return clientResponse; |
||||
} |
||||
catch (Exception ex) { |
||||
byte[] body = ex.toString().getBytes("UTF-8"); |
||||
return new MockClientHttpResponse(body, HttpStatus.INTERNAL_SERVER_ERROR); |
||||
} |
||||
} |
||||
}; |
||||
} |
||||
|
||||
private HttpHeaders getResponseHeaders(MockHttpServletResponse response) { |
||||
HttpHeaders headers = new HttpHeaders(); |
||||
for (String name : response.getHeaderNames()) { |
||||
List<String> values = response.getHeaders(name); |
||||
for (String value : values) { |
||||
headers.add(name, value); |
||||
} |
||||
} |
||||
return headers; |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,88 @@
@@ -0,0 +1,88 @@
|
||||
/* |
||||
* Copyright 2011 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.test.web.client.samples; |
||||
|
||||
import static org.junit.Assert.*; |
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; |
||||
|
||||
import org.junit.Before; |
||||
import org.junit.Test; |
||||
import org.junit.runner.RunWith; |
||||
import org.springframework.beans.factory.annotation.Autowired; |
||||
import org.springframework.context.annotation.ComponentScan; |
||||
import org.springframework.context.annotation.Configuration; |
||||
import org.springframework.stereotype.Controller; |
||||
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.MockMvcClientHttpRequestFactory; |
||||
import org.springframework.test.web.servlet.MockMvc; |
||||
import org.springframework.test.web.servlet.setup.MockMvcBuilders; |
||||
import org.springframework.web.bind.annotation.RequestMapping; |
||||
import org.springframework.web.bind.annotation.RequestMethod; |
||||
import org.springframework.web.bind.annotation.ResponseBody; |
||||
import org.springframework.web.client.RestTemplate; |
||||
import org.springframework.web.context.WebApplicationContext; |
||||
import org.springframework.web.servlet.config.annotation.EnableWebMvc; |
||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; |
||||
|
||||
/** |
||||
* Tests dependent on access to resources under the web application root directory. |
||||
* |
||||
* @author Rossen Stoyanchev |
||||
*/ |
||||
@RunWith(SpringJUnit4ClassRunner.class) |
||||
@WebAppConfiguration |
||||
@ContextConfiguration |
||||
public class MockMvcClientHttpRequestFactoryTests { |
||||
|
||||
@Autowired |
||||
private WebApplicationContext wac; |
||||
|
||||
private RestTemplate restTemplate; |
||||
|
||||
|
||||
@Before |
||||
public void setup() { |
||||
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).alwaysExpect(status().isOk()).build(); |
||||
this.restTemplate = new RestTemplate(new MockMvcClientHttpRequestFactory(mockMvc)); |
||||
} |
||||
|
||||
@Test |
||||
public void test() throws Exception { |
||||
String result = this.restTemplate.getForObject("/foo", String.class); |
||||
assertEquals("bar", result); |
||||
} |
||||
|
||||
|
||||
@EnableWebMvc |
||||
@Configuration |
||||
@ComponentScan(basePackageClasses=MockMvcClientHttpRequestFactoryTests.class) |
||||
static class MyWebConfig extends WebMvcConfigurerAdapter { |
||||
} |
||||
|
||||
@Controller |
||||
static class MyController { |
||||
|
||||
@RequestMapping(value="/foo", method=RequestMethod.GET) |
||||
@ResponseBody |
||||
public String handle() { |
||||
return "bar"; |
||||
} |
||||
} |
||||
|
||||
} |
||||
Loading…
Reference in new issue