Невозможно автоматически подключить RestTemplate для модульного тестирования

У меня есть служба, которая использует экземпляр RestTemplate с автоматическим подключением, как показано ниже.

@Service
class SomeAPIService {
    private RestTemplate restTemplate;

    SomeAPIService(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
        this.restTemplate.setRequestFactory(HttpUtils.getRequestFactory());
    }
}

В не тестовой среде все работает нормально. Но когда я пытаюсь запустить следующий модульный тест в тестовом профиле, он начинает жаловаться на невозможность автоматического подключения шаблона отдыха.

@RunWith( SpringJUnit4ClassRunner.class )
@SpringBootTest(classes = MyApplication.class, webEnvironment = RANDOM_PORT, properties = "management.port:0")
@ActiveProfiles(profiles = "test")
@EmbeddedPostgresInstance(flywaySchema = "db/migration")
public abstract class BaseTest {
}

@SpringBootTest(classes = SomeAPIService.class)
public class SomeAPIServiceTest extends BaseTest {
    @Autowired
    SomeAPIService someAPIService;

    @Test
    public void querySomeAPI() throws Exception {
        String expected = someAPIService.someMethod("someStringParam");
    }
}

Ниже приводится подробное исключение -

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'someAPIService': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.web.client.RestTemplate' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

Какие-нибудь подсказки?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
5 863
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы пытаетесь автоматически подключить SomeAPIService, не удовлетворяя его зависимости. Вам следует внедрить шаблон Rest в SomeAPIService. Но вы получаете исключение NoSuchBeanDefinitionException для шаблона отдыха.

Посмотрите, как его вводить:

Как автоматически подключить RestTemplate с помощью аннотаций

У меня есть класс HttpConfiguration с аннотацией Configuration с определением bean-компонента для RestTemplate

comiventor 08.04.2018 10:36

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

comiventor 08.04.2018 10:40

Попробуйте изменить @SpringBootTest (classes = SomeAPIService.class) на @SpringBootTest (classes = MyApplication.class) Согласно документации по загрузке Spring: «классы - аннотированные классы, используемые для загрузки ApplicationContext».

Emre Savcı 08.04.2018 11:12

Спасибо, Эмре. Это было полезно и помогло мне решить проблему, но теперь активный профиль не дает покоя. Моему приложению требуется дополнительный активный профиль для построения определенных зависимостей. Я предоставляю активный профиль для теста maven, такого как этот mvn test -P myActiveProfile, но он дает мне ту же ошибку, что и при отказе от указания myActiveProfile при обычном запуске. проблема с проводкой, но другого типа

comiventor 09.04.2018 07:08

Использование @SpringBootTest(classes = MyApplication.class) фактически запускало все приложение, но не тестовый пример

comiventor 09.04.2018 09:40
Ответ принят как подходящий

Следующее помогло мне автоматически установить правильные зависимости. Решение состоит в том, чтобы также включить RestTemplate.class в список классов для SpringBootTest.

@SpringBootTest(classes = {RestTemplate.class, SomeAPIService.class})
class SomeAPIService {
    @Autowired
    SomeAPIService someAPIService;

    @Test
    public void querySomeAPI() throws Exception {
        String expected = someAPIService.someMethod("someStringParam");
    }
}

Ответ @Emre помог мне прийти к окончательному решению.

Альтернативный ответ - использовать TestRestTemplate.

Из официальных документов >>>

TestRestTemplate можно создать непосредственно в ваших интеграционных тестах, как показано в следующем примере:

public class MyTest {

    private TestRestTemplate template = new TestRestTemplate();

    @Test
    public void testRequest() throws Exception {
        HttpHeaders headers = this.template.getForEntity(
                "https://myhost.example.com/example", String.class).getHeaders();
        assertThat(headers.getLocation()).hasHost("other.example.com");
    }

}

В качестве альтернативы, если вы используете аннотацию @SpringBootTest с WebEnvironment.RANDOM_PORT или WebEnvironment.DEFINED_PORT, вы можете ввести полностью сконфигурированный TestRestTemplate и начать его использовать. При необходимости можно применить дополнительные настройки через bean-компонент RestTemplateBuilder.

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