Mockito thenReturn не работает, возвращает Null - PullRequest
0 голосов
/ 01 августа 2020

Я пытаюсь издеваться над методом RestTemplate.exchange. Основной класс выглядит следующим образом:

import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.RequestEntity;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;

public class JsonPlaceHolder {
    
    private RestTemplate restTemplate;

    public JsonPlaceHolder(RestTemplate restTemplate) {
        super();
        this.restTemplate = restTemplate;
    }

    
    public Post fetchPostEntity() {
        HttpHeaders headers = new HttpHeaders();
        Post reqPost = new Post();
        HttpEntity<Post> requestEntity = new HttpEntity<Post>(reqPost, headers);
        ResponseEntity<Post> respEntity = restTemplate.exchange("https://jsonplaceholder.typicode.com/posts/1",
                HttpMethod.GET, requestEntity, Post.class);
        System.out.println(respEntity);     
        return reqPost;     
    }
}

Класс post:

public class Post {
    private String userId;
    private String id;
    private String title;
    private String body;
    
    // Getters and Setters

    @Override
    public String toString() {
        return "Post [userId=" + userId + ", id=" + id + ", title=" + title + ", body=" + body + "]";
    }
    
}

Чтобы протестировать вышеуказанный класс, у меня есть следующий код:

@RunWith(MockitoJUnitRunner.class)
public class JsonPlaceHolderTest {
    
    @Mock
    private RestTemplate mockedRestTemplate;
    private String post1Uri = "https://jsonplaceholder.typicode.com/posts/1";

    
    
    @Test
    public void restTemplateExchange() {
        JsonPlaceHolder jsonPlaceHolder = new JsonPlaceHolder(mockedRestTemplate);
        
        Post fakePost = new Post();
        fakePost.setBody("BODY");
        fakePost.setId("44");
        fakePost.setUserId("USERID");
        fakePost.setTitle("TITLE");
        
        HttpHeaders headers = new HttpHeaders();
        
        Post reqPost = new Post();
        HttpEntity<Post> requestEntity = new HttpEntity<Post>(reqPost, headers);
        
        
        ResponseEntity<Post> fakeRespEntity = new ResponseEntity<Post>(fakePost, HttpStatus.OK);
        
        
        when(mockedRestTemplate.exchange(post1Uri, HttpMethod.GET, requestEntity, Post.class)).thenReturn(fakeRespEntity);
        
        Post respPost = jsonPlaceHolder.fetchPostEntity();
        
        System.out.println(respPost);
    }

}

вывод:

null
Post [userId=null, id=null, title=null, body=null]

Почему when().thenReturn() не работает с RestTemplate.exchange(). Я пробовал то же самое с RestTemplate.getForEntity(), и это работает.

1 Ответ

0 голосов
/ 01 августа 2020

RequestEntity - это не тот экземпляр, который вы используете для своего макета, поскольку он создается внутри функции fetchPostEntity. Вы можете попробовать:

when(mockedRestTemplate.exchange(eq(post1Uri), eq(HttpMethod.GET), any(HttpEntity.class), any()).thenReturn(fakeRespEntity);

См. https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/ArgumentMatchers.html для получения дополнительной информации о сопоставлениях аргументов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...