Эта проблема заключается в том, что при нормальном запуске приложения Spring Boot автоматически настраивает RestTemplateBuilder
для вас (из-за аннотации @SpringBootApplication
), но в тесте у вас нет соответствующей аннотации @SpringBootTest
и * 1004.* в конструкторе MyClient, конечно, null (который выдает ошибку при попытке вызвать для него метод build ()).
Если вы добавите его как есть, он будет использовать контекст конфигурации приложения по умолчанию, и оба RestTemplateBuilder
и MyResponseErrorHandler
будут рабочими bean-компонентами (обратите внимание, что в этом случае MyClient
и MyResponseErrorHandler
должны быть настроены как bean-компоненты - например, пометив их @Component
).
@RunWith(SpringRunner.class)
@SpringBootTest
public class MyClientTest {
@Autowired
private MyClient myClient;
@Mock
private MyResponseErrorHandler myResponseErrorHandler;
@Test
public void sampleTest() throws IOException {
//The example of configuring myResponseErrorHandler behavior
Mockito.when(myResponseErrorHandler.hasError(Mockito.any())).thenReturn(true);
//Call myClient method
//Asserts...
}
}
Кроме того, ничего не делайте с RestTemplate
, потому что он будет создан программно внутри конструктора MyClient.
Другой подход заключается в создании отдельной тестовой конфигурации, где вы можете получитьbean-компонент по умолчанию RestTemplateBuilder
(предоставляется Spring) и mocked MyResponseErrorHandler
(для настройки его поведения позже).Это может дать вам полный контроль над настройкой всех ваших bean-компонентов для тестов без использования контекста вашего приложения.
Если вы хотите в этом разобраться - вот шаги для достижения этого:
- Создание класса конфигурации теста с
MyResponseErrorHandler
bean:
@TestConfiguration
public class MyClientTestConfiguration {
@Autowired
private RestTemplateBuilder restTemplateBuilder;
@Bean
public ResponseErrorHandler myResponseErrorHandler() {
return Mockito.mock(MyResponseErrorHandler.class);
}
@Bean
public MyClient myClient() {
return new MyClient(restTemplateBuilder, myResponseErrorHandler());
}
}
Ваш тестовый класс будет таким:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = MyClientTestConfiguration.class)
public class MyClientTest {
@Autowired //wired from MyClientTestConfiguration class
private MyClient myClient;
@Autowired //wired from MyClientTestConfiguration class
private MyResponseErrorHandler myResponseErrorHandler;
@Test
public void sampleTest() throws IOException {
//The example of configuring myResponseErrorHandler behavior
Mockito.when(myResponseErrorHandler.hasError(Mockito.any())).thenReturn(true);
//Calling myClient method...
//Asserts...
}
}