2009-10-14 6 views
3

Следующий тест иллюстрирует, что этот тестовый компонент инициализируется дважды весной. Я надеюсь, кто-то скажет мне, почему это так, так как это должно быть только один раз. Вот тест: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 

ответ

8

Это не Спринг конвенции. Вы должны следовать соглашениям JUnit, т. Е. Инициализация или декомпозиция всего пакета должна выполняться соответственно в @BeforeClass и @AfterClass, или вы можете использовать @Autowire и позволить Spring обрабатывать область действия объекта.

Новый комплект будет построен для каждого испытания. Это более очевидно в JUnit3, где вам нужно было создать новый пакет с использованием указанного имени теста.

Посмотрите на JavaDoc:

Тест аннотация говорит JUnit, что общественность недействительного метода, к которому он прикреплен может работать в качестве тестового примера. К запустить метод, JUnit сначала создает новый экземпляр класса, тогда вызывает аннотированный метод. Любое исключений, брошенных тестом, будет , сообщенный JUnit как отказ. Если не выбрано исключений , то тест считается выполненным.

Ваш случай использования немного озадачен, так как ваш тест на самом деле ничего не делает, и нет никакого компонента, о котором вы ссылаетесь. По умолчанию Spring beans объявляются с атрибутом scope = "singleton" по умолчанию, так что если бы вы фактически объявили bean-компонент, это был бы кешированный синглтон. Однако это не имеет никакого отношения к выполнению метода.

+0

уведомление: «реализует InitializingBean» делает его bean-компонентом. Или, по крайней мере, я предполагаю по имени. И тот факт, что я могу поля @Autowire и тому подобное. Проблема с @BeforeClass заключается в том, что она выполняется до того, как Spring впрыснет в тестовый класс. Поскольку мне нравится вводить тестовые ресурсы, это часто является проблемой. @Before и такие также выполняются перед инъекцией, но выполняются для каждого теста. Лучшее, что я нашел, это использовать afterPropertiesSet() из интерфейса InitiliazingBean и выполнить любую настройку, требуемую там, где есть ресурсы для инъекций. Проблема, которую я обнаружил, заключается в том, что afterPropertiesSet запускается перед каждым тестом. – harschware

+0

Это имеет смысл. Я не догонял остальную часть вашего кода, прежде чем он был отредактирован, чтобы включить форматирование. Я уверен, что вы можете использовать lazy-init = "true", чтобы создать экземпляр Spring по запросу в @BeforeClass или @Before, используя BeanFactory, но это не решает повторную инициализацию. Возможно, это только мое мнение, но я не думаю, что есть проблема при повторной инициализации, если нет ограничения кода. – Droo

+0

Исправление к моему комментарию: «@Before и такие же выполнить перед инъекцией» не соответствует действительности. Я не думаю, что многое изменилось с этой проблемой. – harschware