#java #spring
#java #spring
Вопрос:
У меня есть следующий компонент конфигурации для не веб-приложения
@Configuration
public class MyBeans {
@Bean
@Scope(value="prototype")
MyObject myObject() {
return new MyObjectImpl();
}
}
С другой стороны, у меня есть свой класс
public class MyCommand implements Command {
@Autowired
private MyObject myObject;
[...]
}
Как я могу заставить myCommand автоматически подключаться к конфигурации в MyBeans без использования XML, чтобы я мог внедрять mocks в другие мои тестовые классы?
Заранее большое спасибо.
Ответ №1:
При конфигурации на основе XML вы бы использовали аннотацию ContextConfiguration. Однако аннотация ContextConfiguration, похоже, не работает с Java Config. Это означает, что вам придется вернуться к настройке контекста вашего приложения при инициализации теста.
Предполагая JUnit4:
@RunWith(SpringJUnit4ClassRunner.class)
public class MyTest{
private ApplicationContext applicationContext;
@Before
public void init(){
this.applicationContext =
new AnnotationConfigApplicationContext(MyBeans.class);
//not necessary if MyBeans defines a bean for MyCommand
//necessary if you need MyCommand - must be annotated @Component
this.applicationContext.scan("package.where.mycommand.is.located");
this.applicationContext.refresh();
//get any beans you need for your tests here
//and set them to private fields
}
@Test
public void fooTest(){
assertTrue(true);
}
}
Комментарии:
1. В качестве альтернативы, вы можете просто передать MyCommand.class непосредственно в конструктор AnnotationConfigApplicationContext. Лично я бы выбрал то, что приведет к меньшему набору текста.
2. Это то, чего я пытался избежать, но после написания выглядит не так уж плохо. Большое спасибо.