4

在 tomcat 7 上运行 Web 应用程序,我的部署描述符包含 2 个侦听器,一个是我创建的自定义侦听器,另一个是 Spring 侦听器:

<listener>
    <listener-class>com.company.appName.web.context.MyContextListener</listener-class>
</listener>

<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

当我运行我的集成测试时,我的监听器根本不会被调用,所以为了克服它,我自己做一些初始化(调用一些基本上是从我的这个监听器调用的静态方法)。无论如何,我想我在这里遗漏了一些东西,听众什么时候被叫到?为什么在我的集成测试期间不会初始化?更具体地说,Spring 上下文确实被初始化了,这是因为我在我的测试类的顶部声明了它:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:testApplicationContext.xml" })

所以 web.xml 从来没有真正使用过..

在这种情况下,弹簧上下文总是首先被调用,在它被初始化之前我没有机会做任何事情 - 是这样吗?有没有办法在春天的上下文之前运行一些代码?

更新:我还想提一下,我在我的测试套件中使用了 @BeforeClass 注释:

@RunWith(Categories.class)
@IncludeCategory(HttpTest.class)
@SuiteClasses({ <MY TEST CLASSES> })
public class HttpSuiteITCase {

    /**
     * Run once before any of the test methods.
     */
    @BeforeClass
    public static void setTestsConfigurations() {
    TestConfiguration.setup(false);
    }
}

使用这种方法并不能解决问题,首先初始化测试类以及我所有的 spring bean。

提前致谢

4

2 回答 2

3

static在您的测试类中注释一个方法@BeforeClass并在那里进行初始化。例如:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "classpath:testApplicationContext.xml" })
public class TestTest {

    @BeforeClass
    static public void beforeClass() {
        // do intialization here
    }

如果您的初始化代码需要访问类字段,因此无法访问,static那么您可以设置 aTestExecutionListener并实现beforeTestClass(). 有关示例,请参阅此博客文章。

于 2012-07-23T02:32:51.610 回答
0

您可以在测试上下文中使用 bean 中的 init-method 来完成。

<bean id="exampleInitBean" class="examples.ExampleBean" init-method="init"/>

公共类 ExampleBean {

public void init() {
    // do some initialization work
}

}

于 2012-07-23T04:02:16.757 回答