5

我想在我的@BeforeTest方法中将一些 web 范围注册到 spring 上下文中。但事实证明,春天的背景仍然null在那个时候。

不过,如果我更改为@BeforeMethod. 我想知道如何访问 中的上下文@BeforeTest,因为我不希望每个测试方法都重复范围注册代码。

下面是我的代码片段。

public class MyTest extends MyBaseTest {
    @Test public void someTest() { /*...*/ }
}

@ContextConfiguration(locations="/my-context.xml")
public class MyBaseTest extends AbstractTestNGSpringContextTests {
    @BeforeTest public void registerWebScopes() {
        ConfigurableBeanFactory factory = (ConfigurableBeanFactory)
                this.applicationContext.getAutowireCapableBeanFactory();
        factory.registerScope("session", new SessionScope());
        factory.registerScope("request", new RequestScope());
    }   

    /* some protected methods here */
}

这是运行测试时的错误消息:

配置失败:@BeforeTest registerWebScopes
java.lang.NullPointerException
    在 my.MyBaseTest.registerWebScopes(MyBaseTest.java:22)
4

2 回答 2

12

调用springTestContextPrepareTestInstance()您的 BeforeTest 方法。

于 2012-07-03T17:16:04.863 回答
3

TestNG 在@BeforeTest方法之前运行@BeforeClass方法。被springTestContextPrepareTestInstance()注释@BeforeClass并设置 applicationContext. 这就是为什么applicationContext仍然null在一个@BeforeTest方法中。@BeforeTest用于对一组标记的测试进行分组。(它不会在每种@Test方法之前运行,所以有点用词不当)。

而不是 using @BeforeTest,您可能应该使用(在当前类中@BeforeClass的第一个之前运行一次)。@Test确保它取决于springTestContextPrepareTestInstance方法,如

@BeforeClass(dependsOnMethods = "springTestContextPrepareTestInstance")
public void registerWebScopes() {
    ConfigurableBeanFactory factory = (ConfigurableBeanFactory) 
            this.applicationContext.getAutowireCapableBeanFactory();
    factory.registerScope("session", new SessionScope());
    factory.registerScope("request", new RequestScope());
}   

这些@BeforeMethod作品也是如此(正如你所提到的),因为它们在@BeforeClass方法之后运行。

于 2014-07-22T20:07:29.690 回答