У меня есть служба, которая использует экземпляр 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: {}
Какие-нибудь подсказки?




Вы пытаетесь автоматически подключить SomeAPIService, не удовлетворяя его зависимости. Вам следует внедрить шаблон Rest в SomeAPIService. Но вы получаете исключение NoSuchBeanDefinitionException для шаблона отдыха.
Посмотрите, как его вводить:
Как автоматически подключить RestTemplate с помощью аннотаций
Кроме того, как я уже упоминал, мне трудно понять, почему все работает нормально в не тестовой среде, когда в тестовой среде возникают перерывы. Я использовал Autowiring таким образом, не вводя зависимостей для других модульных тестов, и никогда не сталкивался с проблемой.
Попробуйте изменить @SpringBootTest (classes = SomeAPIService.class) на @SpringBootTest (classes = MyApplication.class) Согласно документации по загрузке Spring: «классы - аннотированные классы, используемые для загрузки ApplicationContext».
Спасибо, Эмре. Это было полезно и помогло мне решить проблему, но теперь активный профиль не дает покоя. Моему приложению требуется дополнительный активный профиль для построения определенных зависимостей. Я предоставляю активный профиль для теста maven, такого как этот mvn test -P myActiveProfile, но он дает мне ту же ошибку, что и при отказе от указания myActiveProfile при обычном запуске. проблема с проводкой, но другого типа
Использование @SpringBootTest(classes = MyApplication.class) фактически запускало все приложение, но не тестовый пример
Следующее помогло мне автоматически установить правильные зависимости. Решение состоит в том, чтобы также включить 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.
У меня есть класс HttpConfiguration с аннотацией Configuration с определением bean-компонента для RestTemplate