Как смоделировать перезапуск звонков при весенней загрузке? - PullRequest
0 голосов
/ 11 января 2019

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

@RunWith(MockitoJUnitRunner.class)
public class ForceServiceTest {
private ForceService forceService;
@Mock
private ForceServiceConfig config;
@Mock
private RestTemplate restTemplate;

@Before
public void setup() {
    forceService = new ForceService(config);
}

@Test
public void apiCall_valid() throws JSONException {
    HttpHeaders headers = new HttpHeaders();
    headers.set(CONTENT_TYPE, "application/x-www-form-urlencoded");
    headers.set(ACCEPT, APPLICATION_JSON);
    HttpEntity<String> entity = new HttpEntity<>(
            "id=null",
            headers);
    config.authTokenUrl = "https://ex...com/..";
    Mockito.when(restTemplate.exchange(config.authTokenUrl, HttpMethod.POST, entity, Access.class)).thenReturn(null);
    // Mockito.when(any()).thenReturn(null);
    forceService.apiCall();
}

}

@Component
public class ForceService {
    private ForceServiceConfig config;
    private RestTemplate restTemplate = new RestTemplate();
public ForceService(ForceServiceConfig config) {

    this.config = config;
}
    private String apiCall() {
    HttpHeaders headers = new HttpHeaders();
    headers.set(CONTENT_TYPE, "application/x-www-form-urlencoded");
    headers.set(ACCEPT, APPLICATION_JSON);

    HttpEntity<String> entity = new HttpEntity<>(
            "&id=" + config.id,
            headers);
    ResponseEntity<Access> response = restTemplate.exchange(config.authTokenUrl, HttpMethod.POST, entity,
            Access.class);
    return response.getBody().token_type + " " + response.getBody().access_token;
     }

}

Я получаю следующую ошибку:

org.springframework.web.client.HttpClientErrorException: 404 не найдено в org.springframework.web.client.DefaultResponseErrorHandler.handleError (DefaultResponseErrorHandler.java:78) в org.springframework.web.client.RestTemplate.handleResponse (RestTemplate.java:700) в org.springframework.web.client.RestTemplate.doExecute (RestTemplate.java:653)

Это вызывает API в тестовом классе, что я не хочу, чтобы это произошло. Мне нужно посмеяться над вызовом resttemplate стороннего API. Как я могу сделать это, не вызывая API?

1 Ответ

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

Это проблема

public class ForceService {
    private ForceServiceConfig config;
    private RestTemplate restTemplate = new RestTemplate(); // HERE

вы создаете новый РЕАЛЬНЫЙ шаблон отдыха. То, что вы, вероятно, хотите, чтобы

  1. Использовать макет, созданный вами в классе теста на упаковку
  2. Используйте шаблон реального отдыха и шпионите за ним.

Не знаю, какая у вас структура (1 файл 2 класса), но можно с уверенностью предположить, что это не так, и в любом случае вы можете просто передать RestTemplate в качестве аргумента ctor. Так

@Component
public class ForceService {
    private ForceServiceConfig config;
    private RestTemplate restTemplate;
public ForceService(ForceServiceConfig config,RestTemplate restTemplate) {
    this.restTemplate=restTemplate;
    this.config = config;
}

и

@Before
public void setup() {
    forceService = new ForceService(config,restTemplate);
}

Теперь, если вы хотите, чтобы RestTemplate был просто заглушкой, которая буквально ничего не делает и возвращает ноль при любых вызовах, если не указано иначе - оставьте это как @Mock.

Однако, если вы хотите, чтобы он работал нормально и перехватывал только определенные вызовы методов и ответы на заглушки, используйте spy.

@Mock
private RestTemplate restTemplate;
private RestTemplate restTemplate=Mockito.mock(RestTemplate.class)

или

private RestTemplate restTemplate=Mockito.spy(new RestTemplate());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...