Я пишу тест с использованием TestNG и Spring Framework (вместе с Spring Boot), и я столкнулся с тем, что контекст приложения не может найти конкретный bean-компонент свойств конфигурации. оба упомянуты в тесте. Простое представление настройки, вызывающей проблему, будет включать следующие конфигурации:
@EnableConfigurationProperties
public class SomePropertyConfiguration {
@Bean(name = "someConfiguration")
@ConfigurationProperties(prefix = "test.prefix")
public CustomPropertyClass customPropertyClass(){
return new CustomPropertyClass();
}
}
@Configuration
public class SomeConfiguration {
public ISomethingApi somethingApi(CustomPropertyClass customPropertyClass){
return new SomethingApi(customPropertyClass.getProperty());
}
}
Тест настраивается простым способом, просто для проверки пары основных свойств:
@TestPropertySource("classpath:/test.properties")
@ContextConfiguration(classes = { SomePropertyConfiguration.class, SomeConfiguration.class })
public class SomethingApiTest extends AbstractTestNGSpringContextTests {
@Inject
private ISomethingApi somethingApi;
@Test
public void test(){
// Do stuff
}
}
Конечным результатом этих настроек является исключение, когда конфигурация для SomethingApi
не может найти допустимый bean-компонент типа CustomPropertyClass
.
Стоит отметить, что если SomeConfiguration
удаляется из теста, а CustomPropertyClass
вводится в тест напрямую, все работает, а свойства являются ожидаемыми значениями, что вызывает наибольшее недоумение в этой проблеме - так что что-то, похоже, заставляет Spring неправильно обрабатывать порядок подключения для beans. У меня есть аналогичные настройки в других проектах, которые работают, как ожидалось, но мне не удалось найти каких-либо значимых различий, которые могли бы вызвать такое поведение (оба проекта находятся в одной и той же основной версии Spring и Spring Boot)
EDIT:
Я пробовал с @Configuration
и без * на SomePropertyConfiguration
, без каких-либо изменений в результатах. В другом проекте, упомянутом в этой работе, класс конфигурации свойств не включает эту явную аннотацию, поэтому я оставил ее в основном примере выше. Я также попытался использовать поле @Autowired
компонента свойства во второй конфигурации и ссылаться на него таким образом для зависимости, а не как параметр (в случае, если это повлияло на порядок подключения или что-то в этом роде), что также не повлияло на результаты.
Я использую Spring framework 5.1.7.RELEASE
и Spring Boot 2.0.9.RELEASE