У меня есть служба, которая использует автосвязанный экземпляр 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");
}
}
Ниже приводится подробное исключение -
Вызвано: org.springframework.beans.factory.UnsatisfiedDependencyException: Ошибка создания bean-компонента с именем «someAPIService»: неудовлетворенная зависимость выражается через параметр конструктора 0; вложенное исключение org.springframework.beans.factory.NoSuchBeanDefinitionException: Нет квалификационный компонент типа «org.springframework.web.client.RestTemplate» Доступно: ожидается по крайней мере 1 bean-компонент, который квалифицируется как autowire кандидат. Аннотации зависимостей: {}
Есть подсказки?
У меня есть класс HttpConfiguration, аннотированный конфигурацией с определением bean-компонента для RestTemplate.
Кроме того, как я уже упоминал, мне трудно понять, почему все работает нормально в нетестовой среде, а в тестовой среде ломается. Я выполнял Autowiring таким образом, не вводя зависимости для других модульных тестов, и никогда не сталкивался с проблемой.
Попробуйте изменить @SpringBootTest (classes = SomeAPIService.class) на @SpringBootTest (classes = MyApplication.class). Согласно документам весенней загрузки: «классы. Аннотированные классы для использования для загрузки ApplicationContext».
Спасибо, Эмре. Это было полезно и помогло мне решить проблему, но теперь активный профиль стал преследовать меня. Моему приложению требуется дополнительный активный профиль для создания определенных зависимостей. Я предоставляю активный профиль для теста maven, как этот
mvn test -P myActiveProfile
, но он дает мне ту же ошибку, что и при отказе от указания myActiveProfile в обычном запуске. проблема с проводкой, но другого родаИспользование
@SpringBootTest(classes = MyApplication.class)
фактически запускало все приложение, но не модульный тест.