Модульный тест для RestTemplate

У меня есть метод обслуживания с restTemplate. Как часть модульного теста, я пытаюсь издеваться над ним, но кое-как не удается.

Метод обслуживания:

@Autowired
private RestTemplate getRestTemplate;

return getRestTemplate.getForObject(restDiagnosisGetUrl, SfdcCustomerResponseType.class);

Метод испытания:

private CaresToSfdcResponseConverter caresToSfdcResponseConverter;

    @Before
    public void setUp() throws Exception {
        caresToSfdcResponseConverter = new CaresToSfdcResponseConverter();

    }
    @Test
    public void testConvert(){
    RestTemplate mock = Mockito.mock(RestTemplate.class);
         Mockito.when(mock.getForObject(Matchers.anyString(), Matchers.eq(SfdcCustomerResponseType.class))).thenReturn(sfdcCustomerResponseType);
}
sfdcRequest = caresToSfdcResponseConverter.convert(responseForSfdcAndHybris);

Это дает NullPointerException. Похоже, что он не может смоделировать шаблон отдыха, и он ломается там, поскольку шаблон отдыха имеет значение null. Любая помощь будет оценена. Спасибо

1 ответ

Решение

Это не сбивает с толку макет шаблона отдыха, но он не внедряет шаблон макета отдыха в ваш рабочий класс. Есть как минимум два способа это исправить.

Вы можете изменить свой производственный код и использовать конструктор внедрения. Переместите RestTemplate в конструктор в качестве параметра, а затем вы можете просто передать макет в тесте:

@Service
public class MyService {
    @Autowired
    public MyService(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }
}

В своем тесте вы просто создадите сервис, как и любой другой объект, и передадите ему свой шаблон макета отдыха.

Или вы можете изменить свой тест, чтобы добавить свой сервис, используя следующую аннотацию:

@RunWith(MockitoJUnitRunner.class)
public class MyServiceTest {
    @InjectMocks
    private MyService myService;

    @Mock
    private RestTemplate restTemplate;

    @Test
    public void testConvert(){
         Mockito.when(mock.getForObject(Matchers.anyString(), Matchers.eq(SfdcCustomerResponseType.class))).thenReturn(sfdcCustomerResponseType);
    }
}

Вы можете увидеть пример в другом вопросе SO: Использование @Mock и @InjectMocks

Я вообще предпочитаю инжектор конструктора.

Другие вопросы по тегам