2

给定一个使用 spring 的测试实用程序注释 ContextConfiguration 来创建 bean 的 testng 类,bean 在测试类的生命周期内只创建一次。

在使用它之前,我总是使用 @BeforeMethod 在每个 @Test 方法之前重建所有内容。

我的问题:有没有办法让spring为每个@Test方法重建bean?

//The beans are unfortunately created only once for the life of the class.
@ContextConfiguration( locations = { "/path/to/my/test/beans.xml"})
public class Foo {

    @BeforeMethod
    public void setUp() throws Exception {
        //I am run for every test in the class
    }

    @AfterMethod
    public void tearDown() throws Exception {
        //I am run for every test in the class
    }

    @Test
    public void testNiceTest1() throws Exception {    }

    @Test
    public void testNiceTest2() throws Exception {    }

}
4

3 回答 3

7

如果您希望在每次测试运行时重新加载上下文,那么您应该扩展 AbstractTestNGSpringContextTests 并使用 @DiritesContext 注释以及 @ContextConfiguration。一个例子:

@ContextConfiguration(locations = {
        "classpath:yourconfig.xml"
})
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
public class YourTestClass extends AbstractTestNGSpringContextTests {
 //magic
}

Context.ClassMode.AFTER_EACH_TEST_METHOD 的 classmode 将导致 spring 在调用每个测试方法后重新加载上下文。您还可以使用 DirtiesContext.ClassMode.AFTER_CLASS 在每个测试类之前重新加载上下文(对于所有启用 spring 的测试类的超类很有用)。

于 2013-01-22T16:00:41.140 回答
1

您的旧 @BeforeMethod 可能是正确的方法。

@ContextConfiguration 旨在在类级别注入 bean - 换句话说,它完全按照设计工作。

于 2012-05-24T03:26:08.547 回答
1

另一种可能性是使用原型范围的 bean。每次实例化测试类时,都会实例化和连接原型范围的 bean。

请注意,JUnit 和 TestNG 对于何时实例化测试类使用不同的逻辑。JUnit 为每个方法创建一个新实例,TestNG 重用测试实例。鉴于问题是关于 TestNG 的,您需要将您的测试分解为许多测试类以实现整体效果。

于 2014-11-11T23:54:27.567 回答