SpringJUnit4ClassRunner инициализирует компоненты для каждого теста?

StackOverflow https://stackoverflow.com/questions/1564238

Вопрос

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

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

Вот файл bean:

<?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
Это было полезно?

Решение

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

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

Взгляните на Javadoc:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top