Mocking RestTemplate с помощью Mockito - PullRequest
0 голосов
/ 04 июня 2018

У меня есть следующий код, который находится внутри метода, который я тестирую.Мне нужно смоделировать этот restTemplate вызов, чтобы получить предсказуемый результат.

GitHubEmail[] gitHubEmails = restTemplate
        .getForObject(userEmailsUrl, GitHubEmail[].class, oAuthToken);

В методе теста я делаю это:

RestTemplate mockRestTemplate = Mockito.mock(RestTemplate.class);

GitHubEmail fakeGitHubEmail = new GitHubEmail("testemail@email.com", 
                                 false, false, GitHubEmailVisibility.PRIVATE);
    GitHubEmail[] fakeEmails = {fakeGitHubEmail};

    Mockito.when(mockRestTemplate.getForObject(
                     Mockito.eq(userUrl), 
                     Mockito.eq(GitHubEmail[].class),
                     Mockito.eq(testOAuthToken)))
           .thenReturn(fakeEmails);

    gitHubService.setRestTemplate(mockRestTemplate);
    User user = gitHubService.getUser(testOAuthToken);

Вещи не работают, как я ожидаюк ... Когда я проверяю переменную gitHubEmails в моем методе, который я тестирую, это null.

Почему это не работает?

1 Ответ

0 голосов
/ 04 июня 2018

Текущий код, как он есть сейчас, не содержит ошибок.Однако из данного кода мы не видим двух вещей:

  1. Мы не видим, чтобы testOAuthToken правильно передавалось в переменную oAuthToken в githubService.
  2. Мы не видим, чтобы userUrl передавалось userEmailsUrl в githubService.

Вы должны убедиться, что все свойства соответствуют тому, который вы ожидаете от нихбыть, иначе издевательство не работает.Учитывая, что вы назвали одно свойство userUrl, а другое - userEmailsUrl, вполне вероятно, что ошибка есть.

Обычно, когда я сталкиваюсь с этими склонными к ошибкам ситуациями насмешки, я использую "любойmatchers " (any(), anyString(), ...) при издевательстве, а затем после вызова и подтверждений я использую Mockito.verify() для проверки соответствия параметров:

Mockito.when(mockRestTemplate.getForObject(
        Mockito.anyString(), // Use anyString()
        Mockito.eq(GitHubEmail[].class),
        Mockito.anyString())) // Use anyString()
    .thenReturn(fakeEmails);

// Call + Assertions ...

Mockito.verify(mockRestTemplate).getForObject(
    Mockito.eq(userUrl), // Use eq()
    Mockito.eq(GitHubEmail[].class),
    Mockito.eq(testOAuthToken)); // Use eq()

Причина этого в том, что вывод verify() дает намного больше обратной связи.Вместо того, чтобы просто потерпеть неудачу, он расскажет, почему он потерпел неудачу, когда:

  • Смоделированный метод был вызван с разными аргументами и какие аргументы
  • Модифицированный объект вызывал разные методы
...