Попытка смоделировать внешний API restClient, но он вызывает фактический API в Java - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь смоделировать внешний API restClient, но он вызывает фактический API вместо того, чтобы насмехаться над ним. Пожалуйста, помогите, поскольку я не уверен, где я иду не так.

Я пытался высмеивать вызов и еще несколько других вещей, но это не сработало.

public class TestService
{
    private static final String EXTERNAL_API = "http://LinktoExternalAPI/";

    @Autowired
    RestTemplate restTemplate;


    public  Map<String, String> countryCodes()
    {
        Map<String, String> map = new TreeMap<>();

        try
        {
            ResponseEntity<testCountry[]> responseEntity = restTemplate
                    .getForEntity(EXTERNAL_API
                            , testCountry[].class);
            List<testCountry> testCountryList = Arrays.asList(responseEntity.getBody());
            map = testCountryList.stream()
                    .collect(Collectors.toMap(testCountry::getCode, testCountry::getName));
        }

        catch (HttpClientErrorException | HttpServerErrorException httpClientOrServerExc)
        {

        }

        return map;
    }
}

Тестовый пример для этогониже:

@RunWith(PowerMockRunner.class)
public class TestServiceTest
{
    @InjectMocks
    TestService testService;

    @Mock
    RestTemplate restTemplate;

    private static final String EXTERNAL_API = "http://LinktoExternalAPI/";

    @Test
    public void testCountryCodes(){

        TestCountry testCountry = new TestCountry();
        testCountry.setCode("JPN");
        testCountry.setName("Japan");

        List<testCountry> testCountryList = new ArrayList<testCountry>();
        testCountryList.add(testCountry);

        Mockito.when(restTemplate.getForEntity(EXTERNAL_API, testCountry[].class)).thenReturn(new ResponseEntity(testCountryList, HttpStatus.OK));
        Map<String, String> result = testService.countryCodes();

        // result is pulling the actual size of the api instead of mocking and sending me testCountryList size.
        <Will mention assertion here>
    }

В результате вы получаете фактический размер API вместо насмешки и отправляете мне testCountryList размер.

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Причиной фактического вызова API, вероятно, является то, что URL, над которым вы работаете, не совпадает с URL-адресом, генерируемым во время выполнения, из-за того, что макет не найден и вызывается фактический API. В этих случаях вы можете использовать Mockito.any().

. Таким образом, код макета будет Mockito.when(restTemplate.getForEntity(Mockito.any(), Mockito.any())).thenReturn(new ResponseEntity(testCountryList, HttpStatus.OK));

@RunWith(MockitoJUnitRunner.class)
public class TestServiceTest {

  @InjectMocks
  private TestService testService;

  @Mock
  private RestTemplate restTemplate;

  @Test
  public void testCountryCodes(){

    TestCountry testCountry = new TestCountry();
    testCountry.setCode("JPN");
    testCountry.setName("Japan");

    TestCountry[] testCountryList = {
        testCountry
    };

    Mockito.when(restTemplate.getForEntity(Mockito.anyString(), Mockito.any())).thenReturn(new ResponseEntity(testCountryList, HttpStatus.OK));

    Map<String, String> result = testService.countryCodes();

    // result is pulling the actual size of the API instead of mocking and sending me testCountryList size.

  }
}

Также попробуйте использовать @RunWith(MockitoJUnitRunner.class) вместо PowerMockRunner.class, так как вы неКажется, ему не нужны возможности PowerMock.

0 голосов
/ 31 октября 2019

Вы издеваетесь над неправильным определением метода.

A getForObject метод с параметрами String и Class не существует. Вам необходимо определить поведение для метода this.

Обратите внимание, что в вашем случае третий параметр (varargs) не используется, поэтому по умолчанию используется пустой массив. Однако Mockito требует, чтобы эта информация использовалась для правильного вызова.

Mockito.when(restTemplate.getForObject(any(String.class), any(Class.class), ArgumentMatchers.<Object>any()))
       .thenReturn(result);

Для более полного примера проверьте мой ответ здесь .

...