如何使用RestTemplate和JUnit测试restclient?

时间:2019-07-12 19:37:09

标签: java rest spring-boot junit resttemplate

我是JUNIT的新手,并且使用RestTemplate来调用我的服务,我得到了200相同的响应。但是,我无法使用JUnit测试该类。尝试了不同的方法,并获得了400和404。我想发布请求正文(json)并测试状态。请让我知道是否有任何问题。

/**
* Rest client implementation
**/  
public class CreateEmailDelegate implements CDM {

    @Autowired
    private RestTemplate restTemplate;
    private  String url = "http://communication-svc-dvnt-b.test.sf.com/CDM-Service-1.0.0/communications/emails";

    public ResponseEntity<CDResponse> createEmail(CDMEmailRequest cDRequest) throws UnavailableServiceException, InvalidInputException {
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.set("SR_API_Key", SR_API_KEY);
        httpHeaders.set("consumerIdentification", CONSUMER_IDENTIFICATION);
        httpHeaders.setContentType(MediaType.APPLICATION_JSON);         
        HttpEntity< CDMEmailRequest > cDRequestEntity = new HttpEntity<>( cDRequest, httpHeaders);  
        ResponseEntity< CDResponse > cDResponse = null;

        try {
            cDResponse = restTemplate.postForEntity(url, cDRequestEntity, CDResponse.class);
        } catch (Exception e) {
            LOGGER.error(e.getMessage());
            throw  e;       
        }

        return cDResponse;
    }
}  

我的Test类,它返回404状态而不是200状态

    @RunWith(SpringJUnit4ClassRunner.class)
    public class CreateEmailCommunicationDelegateTest {

        @Before
        public void setup() {
            httpHeaders = new HttpHeaders();
            httpHeaders.set("SR_API_Key", SR_API_KEY);
            httpHeaders.set("consumerIdentification", CONSUMER_IDENTIFICATION);
            httpHeaders.set("X_SF_Transaction_Id", X_SF_Transaction_Id);
            httpHeaders.setContentType(MediaType.APPLICATION_JSON);
            DefaultMockMvcBuilder builder = MockMvcBuilders.webAppContextSetup(this.wac);
            this.mockMvc = builder.build();
        }


        public void testResponse() throws Exception, HttpClientErrorException, JsonProcessingException {
            String url = "http://communication-svc-dvnt-b.test.statefarm.com/CommunicationDeliveryManagement-Service-1.0.0/communications/emails";

            CDMEmailRequest anObject = new CDMEmailRequest();
            ResultMatcher ok = MockMvcResultMatchers.status().isOk();
            ObjectMapper mapper = new ObjectMapper();
            mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, false);
            ObjectWriter ow = mapper.writer().withDefaultPrettyPrinter();
            String requestJson = ow.writeValueAsString(anObject);

            System.out.println(requestJson);
            MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.post(url).contentType(MediaType.APPLICATION_JSON_UTF8).content(requestJson);
            this.mockMvc.perform(builder).andExpect(ok).andDo(MockMvcResultHandlers.print());
        }
    } 

使用TestRestTemplate而不是MockMvc的我的Test类返回400

@RunWith(SpringJUnit4ClassRunner.class)
public class CreateEmailCommunicationDelegateTest {

    @Before
    public void setup() {
        httpHeaders = new HttpHeaders();
        // rest headers as above
    }

    @Test
    public void testResponse() throws Exception, HttpClientErrorException, JsonProcessingException {

        String url = "http://communication-svc-dvnt-b.test.statefarm.com/CommunicationDeliveryManagement-Service-1.0.0/communications/emails";

        String username = "";
        String password = "";
        HttpEntity<CDMEmailRequest>
                cDEntity = new HttpEntity<>(httpHeaders);

        restTemplate = new TestRestTemplate(username, password);

        responseEntity =
                restTemplate.exchange(url, HttpMethod.POST, cDEntity,
                        CDResponse.class);

        assertNotNull(responseEntity);
        assertEquals(HttpStatus.OK,
                responseEntity.getStatusCode());
    }
} 

1 个答案:

答案 0 :(得分:0)

我认为您正在尝试实施集成测试而不是单元测试,两者之间存在很大差异。 MockMvc用于实现单元测试,TestRestTemplate用于集成测试。您既不能使用它来测试客户端实现。

请参见Unit and Integration Tests in Spring Boot

如果您正在使用Spring Boot,则可以使用另一种方法来实现目标,请使用Spring boot testing of a rest client来查看问题@RestClientTest