3

下面的测试说明了这个测试 bean 被 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
4

1 回答 1

8

这不是春季大会。您应该遵循 JUnit 约定,即套件范围的初始化或解构应该在 @BeforeClass 和 @AfterClass 中相应地完成,或者您可以使用 @Autowire 并让 Spring 处理对象的范围。

将为每个测试构建一个新套件。这在 JUnit3 中更为明显,您必须使用指定的测试名称创建一个新套件。

看一下JavaDoc

Test 注释告诉 JUnit,它所附加的公共 void 方法可以作为测试用例运行。为了运行该方法,JUnit 首先构造一个新的类实例,然后调用带注释的方法。测试抛出的任何异常都会被 JUnit 报告为失败。如果没有抛出异常,则假定测试成功。

您的用例有点令人费解,因为您的测试实际上并没有做任何事情,并且没有您引用的 bean。默认情况下,Spring bean 是使用默认的 scope="singleton" 属性声明的,所以如果你真的声明了一个 bean,它就会是一个缓存的单例。但是,这与方法执行无关。

于 2009-10-14T05:00:38.473 回答