我想在我的@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)
答案 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
方法之后运行。