Есть ли способ смоделировать вызовы методов на локальном объекте - PullRequest
0 голосов
/ 17 октября 2019

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

В одном из классов они создали локальный экземпляр rest-template внутри функции вместо @Autowiring.

public LatxDetails getLatxCaseDetail_Fallback(String endpoint, Map<String, String> requestMap) {

//some code

RestTemplate restTemplate = new RestTemplate(); 
ResponseEntity<String> response = restTemplate.exchange(kxCreateEndpoint, HttpMethod.POST, httpEntity, String.class);

//some code

Я не могу смоделировать остальной вызов. Я не могу добавить другие внешние банки или изменить код. Как мне поступить? Любая помощь очень ценится.

Ответы [ 2 ]

2 голосов
/ 17 октября 2019

Очевидным решением было бы внедрить RestTemplate вместо того, чтобы создавать его локально, но, как вы сказали, что вы не можете изменить существующий код, я бы предложил использовать PowerMock с Mockito для замены вызова конструктораRestTemplate с использованием метода PowerMockito.whenNew* 1007. *.

Например,

RestTemplate restTemplateMock = Mockito.mock(RestTemplate.class);
PowerMockito.whenNew(RestTemplate.class).withAnyArguments().thenReturn(restTemplateMock);

, а затем выполнение установки when для объекта restTemplateMock.

Как уже упоминал Стрелок в комментариях: чтобы использовать PowerMockito, необходимо запустить тест с PowerMockRunner, пометив класс теста с помощью @RunWith(PowerMockRunner.class) и @PrepareForTest.

Например

@RunWith(PowerMockRunner.class)
@PrepareForTest(RestTemplate.class)
public class Test {
0 голосов
/ 17 октября 2019

Либо замените свой RestTemplate на Mock, либо создайте его шпиона:

// Mock
RestTemplate restTemplate = Mockito.mock(RestTemplate.class);

// Spy
RestTemplate restTemplate = new RestTemplate(); 
RestTemplate spy = Mockito.spy(restTemplate);

Вы можете смоделировать метод exchange как обычно:

// mock
doReturn(...).when(restTemplate).exchange(...)

// spy
doReturn(...).when(spy).exchange(...)
...