Вы можете создать TestApplication (в src/test/java
), который тривиально расширяет ваш фактический класс приложения Spring Boot и зависит от вашего тестового компонента. Затем попросите SpringBootTest загрузить ваше TestApplication вместо производственного приложения.
Пример TestApplication:
@DependsOn("beanB")
@Configuration
@Import(YourApplication.class)
public class TestApplication {}
Пример класса тестирования:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestApplication.class)
public class YourApplicationTests {
...
Но в тестах я хочу, чтобы бин B создавался перед бином A
...
и я не хочу связывать производственный код с тестами.
blockquote>Что-то вроде этого?
@Profile("test") @Bean public BeanB beanB() { return new BeanB(); } @Profile("test") @Bean public BeanA beanA(BeanB beanB) { return new BeanA(); } @Profile("!test") @Bean public BeanA beanA() { return new BeanA(); }
Нет простого способа сделать то, что ты просишь. Лучше всего иметь необязательную зависимость в A. В производственной среде зависимость будет отсутствовать и будет игнорироваться. В тестах вы предоставите компонент, содержащий вашу реализацию подготовки к тесту.
Да, вы добавляете немного дополнительной сложности ради тестов, которые не идеальны, но очень ограничены.
Прости страшные имена:
interface APreparer {
void prepareA();
}
@Component
public class A {
public A(final Optional<APreparer> preparer) {
preparer.ifPresent(APreparer::prepareA);
}
}