Java 使用TestRestTemplate进行Spring集成测试
我正在学习Spring集成测试和使用org.springframework.boot.test.web.client.TestRestTemplate。 我的Spring启动版本是2.0.2,并带有一些默认配置 我的测试班是:Java 使用TestRestTemplate进行Spring集成测试,java,spring,spring-boot,jackson,integration-testing,Java,Spring,Spring Boot,Jackson,Integration Testing,我正在学习Spring集成测试和使用org.springframework.boot.test.web.client.TestRestTemplate。 我的Spring启动版本是2.0.2,并带有一些默认配置 我的测试班是: @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT) public class UserControllerIntegrationTest {
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)
public class UserControllerIntegrationTest {
@Autowired
TestRestTemplate restTemplate;
String userBaseUrl = "/api/user/";
UserDto userDto;
@Before
public void setUp() {
EnhancedRandom er = EnhancedRandomBuilder.aNewEnhancedRandomBuilder().collectionSizeRange(1, 1).build();
userDto = er.nextObject(UserDto.class);
}
@Test
public void registerUser() throws Exception{
ResponseEntity<ServiceResponse> responseEntity = restTemplate.postForEntity(userBaseUrl+"register_user", userDto, ServiceResponse.class);
assertEquals(responseEntity.getStatusCode(), HttpStatus.OK);
}
}
我试图通过谷歌搜索解决此问题,但无法解决此问题。您的问题可能是由于您收到一些错误响应,而这些错误响应无法解析为ServiceResponse。尝试将ResponseEntity类型更改为String,而不是ServiceResponse类型
ResponseEntity<String> responseEntity = restTemplate.postForEntity(userBaseUrl+"register_user", userDto, String.class);
System.out.println("This is the response as a String" + responseEntity.getBody());
我相信通过这种方式,您将能够看到呼叫返回的内容。您的问题可能是因为您得到了一些错误响应,而这些错误响应无法解析为ServiceResponse。尝试将ResponseEntity类型更改为String,而不是ServiceResponse类型
ResponseEntity<String> responseEntity = restTemplate.postForEntity(userBaseUrl+"register_user", userDto, String.class);
System.out.println("This is the response as a String" + responseEntity.getBody());
我相信这样你就能看到呼叫返回的内容。我解决了这个问题。我对代码做了一些修改。我补充说:
public HttpHeaders setHeaders(String accesstoken) {
List<MediaType> acceptableMediaTypes = new ArrayList<MediaType>();
acceptableMediaTypes.add(MediaType.APPLICATION_JSON);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setAccept(acceptableMediaTypes);
headers.set("accesstoken", accesstoken);
return headers;
}
并将试验方法更改为:
@Test
public void registerUser() throws Exception{
super.getLog().info("Register user integration test.");
HttpHeaders headers = setHeaders(null);
HttpEntity<UserDto> entity = new HttpEntity<UserDto>(userDto,headers);
ResponseEntity<String> responseEntity = restTemplate.exchange(userBaseUrl+"register_user", HttpMethod.POST, entity, String.class);
assertEquals(responseEntity.getStatusCode(), HttpStatus.OK);
assertNotNull(responseEntity.getBody());
ServiceResponse serviceResponse = super.gson.fromJson(responseEntity.getBody(), ServiceResponse.class);
Map<String, Object> data = (Map<String, Object>) serviceResponse.getData();
assertTrue(data.containsKey("accesstoken"));
assertTrue(data.containsKey("user"));
}
而不是使用这个:
ResponseEntity<ServiceResponse> responseEntity = restTemplate.postForEntity(userBaseUrl+"register_user", userDto, ServiceResponse.class);
我解决了这个问题。我对代码做了一些修改。我补充说:
public HttpHeaders setHeaders(String accesstoken) {
List<MediaType> acceptableMediaTypes = new ArrayList<MediaType>();
acceptableMediaTypes.add(MediaType.APPLICATION_JSON);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setAccept(acceptableMediaTypes);
headers.set("accesstoken", accesstoken);
return headers;
}
并将试验方法更改为:
@Test
public void registerUser() throws Exception{
super.getLog().info("Register user integration test.");
HttpHeaders headers = setHeaders(null);
HttpEntity<UserDto> entity = new HttpEntity<UserDto>(userDto,headers);
ResponseEntity<String> responseEntity = restTemplate.exchange(userBaseUrl+"register_user", HttpMethod.POST, entity, String.class);
assertEquals(responseEntity.getStatusCode(), HttpStatus.OK);
assertNotNull(responseEntity.getBody());
ServiceResponse serviceResponse = super.gson.fromJson(responseEntity.getBody(), ServiceResponse.class);
Map<String, Object> data = (Map<String, Object>) serviceResponse.getData();
assertTrue(data.containsKey("accesstoken"));
assertTrue(data.containsKey("user"));
}
而不是使用这个:
ResponseEntity<ServiceResponse> responseEntity = restTemplate.postForEntity(userBaseUrl+"register_user", userDto, ServiceResponse.class);
我有正确的响应类型,因为它在其他rest客户端(如Postman)上工作。它不会返回字符串。或者您的意思是,当它返回JSON时,我们需要使用String.class?如果您运行上面的代码,您可以看到JSON响应为String。让我知道打印返回的内容。我尝试了你的代码,但是这个JSON响应。{时间戳:2018-06-07T05:02:10.873+0000,状态:415,错误:不支持的媒体类型,消息:内容类型'application/octet stream;charset=UTF-8'不支持,路径:/api/user/register\u user}这意味着您有一个错误响应。错误415不支持的媒体。我猜您对resttemplate发布的数据有一些问题。内容类型应该是application/json,而不是application/octetstream。它不会返回字符串。或者您的意思是,当它返回JSON时,我们需要使用String.class?如果您运行上面的代码,您可以看到JSON响应为String。让我知道打印返回的内容。我尝试了你的代码,但是这个JSON响应。{时间戳:2018-06-07T05:02:10.873+0000,状态:415,错误:不支持的媒体类型,消息:内容类型'application/octet stream;charset=UTF-8'不支持,路径:/api/user/register\u user}这意味着您有一个错误响应。错误415不支持的媒体。我猜您对resttemplate发布的数据有一些问题。内容类型应该是application/json,而不是application/octet-stream。如果我的答案被标注为答案,我将不胜感激。这正是我向你们推荐的。请将我的答案标记为答案。