Модульный тест для 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
Я вообще предпочитаю инжектор конструктора.