Тест Mockito RestTemplate не проходит - HttpEntity имеет и сущность, и заголовки - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь смоделировать клиент Rest с помощью Mockito, который принимает следующее: -

MainServiceClass.java

public String serviceCall(String s1){

    String data2 = "s1";

  try{
      headers = new HttpHeaders();
      headers.setContentType(MediaType.APPLICATION_JSON);
      headers.set("headers1", "headers1");

      HttpEntity<String> entity = new HttpEntity<String>(data2, headers);
        ResponseEntity<Object> responseEntity = restTemplate.exchange(someurl, HttpMethod.POST, entity, Object.class);

      return someString; }

ServiceTest.java

@RunWith(MockitoJUnitRunner.class)
@SpringBootTest
public class RestTemplateTests {

 @InjectMocks
    @Spy
    private Someservice service;

    @Autowired
    private MockMvc mockMvc;


        @Mock
        RestTemplate restTemplate;

        ResponseEntity responseEntity = mock(ResponseEntity.class);



    @Test
    public void myCallToTemplate() throws Exception {
    @Test
    public Mytestforcallingservice() {
      Mockito.when(restTemplate.exchange(
                                    someurl,
                                    HttpMethod.POST,
                                    Mockito.<HttpEntity<String>> any(),
                                    Mockito.<Class<?>> 
                                any())).thenReturn(responseEntity);
                    String s2 = service.serviceCall(s1);
                    Assert.assertEquals(s2, "hey");
    }

Ниже моя ошибка: -

.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
        Invalid use of argument matchers!
        4 matchers expected, 2 recorded:
        -> at com.example.MyServiceClass.Mytestforcallingservice(ServiceTest.java:110)
        -> at com.example.ServiceTest.Mytestforcallingservice(ServiceTest.java:110)

        This exception may occur if matchers are combined with raw values:
            //incorrect:
            someMethod(anyObject(), "raw String");
        When using matchers, all arguments have to be provided by matchers.
        For example:
            //correct:
            someMethod(anyObject(), eq("String by matcher"));

Тест завершается неудачно при формировании HttpEntity, который имеет как data2, так и заголовки. Как я могу сформировать это в вызове Mockito?

Кроме того, как я могу это проверить.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Mockito говорит, что вы не можете использовать сопоставления аргументов (в вашем случае Mockito.any ()) с необработанными значениями (в вашем случае "someurl" и HttpMethod.POST) Таким образом, либо вы удаляете сопоставления аргументов, либо добавляете сопоставление аргументов в необработанные значения. Mockito.eq для «someurl» и HttpMethod.POST в вашем случае вызовут макет в вашем тесте. см. ниже.

Также, если вы хотите убедиться, что шаблон отдыха был вызван определенным образом, вы можете использовать Mockito.verify (). См. Ниже, чтобы убедиться, что остальной шаблон был вызван с определенным URL

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

public class MyService {
    private String someurl = "myurl";
    private RestTemplate restTemplate = new RestTemplate();

    public String serviceCall(String s1) {

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.set("headers1", "headers1");

        HttpEntity<String> entity = new HttpEntity<String>(s1, headers);
        ResponseEntity<String> responseEntity = restTemplate.exchange(someurl, HttpMethod.POST, entity, String.class);

        return responseEntity.getBody();
    }

}

и

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;

@RunWith(MockitoJUnitRunner.class)
public class RestTemplateTests {

    @Mock
    private RestTemplate restTemplate;

    private String testUrl = "myurl";
    @InjectMocks
    private MyService serviceClass;

    @Test
    public void test1() {
        String expectedBody = "hey";
        ResponseEntity<String> responseEntity = new ResponseEntity<>(expectedBody, HttpStatus.OK);
        when(restTemplate.exchange(eq(testUrl), eq(HttpMethod.POST), any(), eq(String.class)))
                .thenReturn(responseEntity);
        String s2 = serviceClass.serviceCall("s1");
        verify(restTemplate, times(1)).exchange(eq(testUrl), any(), any(), eq(String.class));
        assertEquals(s2, expectedBody);
    }
}
0 голосов
/ 11 января 2019

Исключение ясно говорит о том, что вы не можете смешивать фиктивные значения и необработанные значения, в вашем случае вы передали два сопоставителя, а именно Mockito.<HttpEntity<String>> any(), Mockito.<Class<?>> any() и другие необработанные значения, как есть, вы должны использовать Matchers.eq для передачи своих значений в соответствие как:

import org.mockito.Matchers.eq

Mockito.when(restTemplate.exchange(
                                eq(someurl),
                                eq(HttpMethod.POST),
                                Mockito.<HttpEntity<String>> any(),
                                Mockito.<Class<?>> any()))
       .thenReturn(responseEntity);
...