Рефакторинг: Mockito с созданием нового экземпляра - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть класс, который является клиентом другого приложения.

class StarFleetClient {
    private RestTemplate restTemplate = null;
    private String accessToken = null;

    public StarFleetClient(String address, String username, String password) {
        restTemplate = new RestTemplate();
        accessToken = restTemplate.postForEntity(...);
    }

    public String attack() {
        return restTemplate.exchange(... )
    }
}

Теперь я создаю несколько экземпляров этого класса всякий раз, когда они мне требуются.Каждый раз учетные данные будут разными.

new StarFleetClient("address1", "user1", "pass");

В другой раз

new StarFleetClient("address1", "user1", "pass");

и так далее ...

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

Как мне написать контрольные примеры для этого?Или как я могу сделать этот код тестируемым?

Технический стек: Spring Boot, Mockito

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Вы можете использовать аннотации @Mock и @InjectMocks для достижения желаемого.Для простоты я заменил методы restTemplate.postForEntity и restTemplate.exchange на restTemplate.toString() в моем фрагменте кода.

Итак, учитывая StarFleetClient:

class StarFleetClient {
    private RestTemplate restTemplate = null;
    private String accessToken = null;

    public StarFleetClient(String address, String username, String password) {
        restTemplate = new RestTemplate();
        accessToken = restTemplate.toString();
    }

    public String attack() {
        return restTemplate.toString();
    }
}

AТест Мокито, который высмеивает RestTemplate может быть:

@RunWith(MockitoJUnitRunner.class)
public class StarFleetClientTest {

    @Mock
    RestTemplate restTemplate;

    @InjectMocks
    StarFleetClient starFleetClient = new StarFleetClient("somewhere", "user", "password");

    @Test
    public void testStarFleetAttack() {
        Mockito.when(restTemplate.toString()).thenReturn("called Mocked RestTemplate");
        assertEquals("called Mocked RestTemplate", starFleetClient.attack());
    }
}
0 голосов
/ 14 ноября 2018

Вам нужно смоделировать RestTemplate

 @Mock
 RestTemplate restTemplate;

и найти способ внедрить его в тестируемый вами класс (с помощью установщика или конструктора).Поскольку вы используете spring, возможно restTemplate - это bean-компонент в вашем приложении, и его можно заменить на макет для вашего тестового контекста.

А затем используйте mockito, чтобы смоделировать желаемое поведение:

Mockito.when(restTemplate.get...)
            .thenReturn(something);
...