Следующий тест иллюстрирует, что этот тестовый компонент инициализируется дважды весной. Я надеюсь, кто-то скажет мне, почему это так, так как это должно быть только один раз. Вот тест:SpringJUnit4ClassRunner инициализирует компоненты для каждого теста?
import org.apache.log4j.Logger;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {})
public class TestAfterPropsSet implements InitializingBean {
private static final Logger logger = Logger.getLogger(TestAfterPropsSet.class);
@Test
public void test1() {
logger.debug("Test1");
}
@Test
public void test2() {
logger.debug("Test2");
}
public void afterPropertiesSet() throws Exception {
logger.debug("Bean Initialized");
}
} // end class
Вот файл боб:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
и вот результат:
2009-10-13 21:20:04,393 [TestAfterPropsSet.java 26] DEBUG - Bean Initialized
2009-10-13 21:20:04,393 [TestAfterPropsSet.java 17] DEBUG - Test1
2009-10-13 21:20:04,393 [TestAfterPropsSet.java 26] DEBUG - Bean Initialized
2009-10-13 21:20:04,393 [TestAfterPropsSet.java 22] DEBUG - Test2
уведомление: «реализует InitializingBean» делает его bean-компонентом. Или, по крайней мере, я предполагаю по имени. И тот факт, что я могу поля @Autowire и тому подобное. Проблема с @BeforeClass заключается в том, что она выполняется до того, как Spring впрыснет в тестовый класс. Поскольку мне нравится вводить тестовые ресурсы, это часто является проблемой. @Before и такие также выполняются перед инъекцией, но выполняются для каждого теста. Лучшее, что я нашел, это использовать afterPropertiesSet() из интерфейса InitiliazingBean и выполнить любую настройку, требуемую там, где есть ресурсы для инъекций. Проблема, которую я обнаружил, заключается в том, что afterPropertiesSet запускается перед каждым тестом. – harschware
Это имеет смысл. Я не догонял остальную часть вашего кода, прежде чем он был отредактирован, чтобы включить форматирование. Я уверен, что вы можете использовать lazy-init = "true", чтобы создать экземпляр Spring по запросу в @BeforeClass или @Before, используя BeanFactory, но это не решает повторную инициализацию. Возможно, это только мое мнение, но я не думаю, что есть проблема при повторной инициализации, если нет ограничения кода. – Droo
Исправление к моему комментарию: «@Before и такие же выполнить перед инъекцией» не соответствует действительности. Я не думаю, что многое изменилось с этой проблемой. – harschware