首页 > 解决方案 > 非弹簧应用程序中resttemplate的Junit

问题描述

我正在开发一个非 Spring 应用程序并使用 spring-web 中的 restTemplate 功能。在编写 Junit 测试时,我无法模拟来自 restTemplate.postForEntity() 的响应。我在这里做错了什么。

下面是函数

public JsonObject apiResponse(Request request) throws JsonProcessingException {
            String queryRequest = objectMapper.writeValueAsString(request);
            HttpHeaders headers = new HttpHeaders();
            headers.add("content-type", "application/json");
            RestTemplate restTemplate = new RestTemplate();
            ResponseEntity<String> responseEntity = restTemplate.postForEntity(
                "https://testurl/test/",
                new HttpEntity<>(queryRequest, headers), String.class);

        return JsonParser.parseString(Objects.requireNonNull(responseEntity.getBody())).getAsJsonObject();

下面是朱尼特

@ExtendWith(MockitoExtension.class)
public class HandlerTest {

        @Spy
        @InjectMocks
        Handler handler;

        @Mock
        RestTemplate restTemplate;

        @Test
        public void apiREsponseTest() throws JsonProcessingException {

       //this is not  working     
       Mockito.doReturn(new ResponseEntity <>("test", HttpStatus.OK))
                    .when(restTemplate).postForEntity(eq("test"), eq(HttpEntity.class), eq(String.class)); 
            
       assertNotNull(handler.apiResponse(request));

标签: javajunitresttemplate

解决方案


RestTemplate restTemplate = new RestTemplate(); 这不会被嘲笑,因为它是一个本地对象,它总是会调用真正的方法。你可以试试这个来模拟restTemplate:

RestTemplate restTemplate = getRestTemplate();

protected RestTemplate getRestTemplate() {
    return new RestTemplate();
 }
//Add this stub to your test
when(handler.getRestTemplate()).thenReturn(restTemplate);

URL 在这里被硬编码:

ResponseEntity<String> responseEntity = restTemplate.postForEntity(
                "https://testurl/test/",
                new HttpEntity<>(queryRequest, headers), String.class);

因此,您还需要更改存根。

Mockito.doReturn(new ResponseEntity <>("test", HttpStatus.OK))
                    .when(restTemplate).postForEntity(eq("https://testurl/test/"), eq(HttpEntity.class), eq(String.class));

进行这些更改应该可以使您的测试变绿。如果这不能解决您的问题,请告诉我。


推荐阅读