Java 使用TestRestTemplate进行Spring集成测试

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 {

我正在学习Spring集成测试和使用org.springframework.boot.test.web.client.TestRestTemplate。 我的Spring启动版本是2.0.2,并带有一些默认配置

我的测试班是:

@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。如果我的答案被标注为答案,我将不胜感激。这正是我向你们推荐的。请将我的答案标记为答案。