访问testng的@BeforeTest中的spring上下文

时间:2012-04-17 03:23:04

标签: java testng spring-test

我想在我的@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 */
}

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

FAILED CONFIGURATION: @BeforeTest registerWebScopes
java.lang.NullPointerException
    at my.MyBaseTest.registerWebScopes(MyBaseTest.java:22)

2 个答案:

答案 0 :(得分:12)

在您的BeforeTest方法中调用springTestContextPrepareTestInstance()

答案 1 :(得分:3)

TestNG在@BeforeTest方法之前运行@BeforeClass方法。 springTestContextPrepareTestInstance()使用@BeforeClass进行注释,并设置applicationContext。这就是applicationContext方法中null仍为@BeforeTest的原因。 @BeforeTest用于删除标记的测试组。 (它不会在每个@Test方法之前运行,所以它有点用词不当。)

您应该使用@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方法之后运行。