用TestNG进行Springdependency injection
Spring支持JUnit:使用RunWith
和ContextConfiguration
注解,事情看起来非常直观
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:dao-context.xml")
这个testing将能够在Eclipse和Maven中正确运行。 我不知道TestNG是否有类似的东西。 我正在考虑转移到这个“下一代”框架,但我没有find与春季testing匹配。
它也适用于TestNG。 你的testing类需要扩展以下类之一:
-
org.springframework.test.context.testng.AbstractTestNGSpringContextTests
-
org.springframework.test.context.testng.AbstractTransactionalTestNGSpringContextTests
这是一个适合我的例子:
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.testng.AbstractTestNGSpringContextTests; import org.testng.annotations.Test; @Test @ContextConfiguration(locations = {"classpath:applicationContext.xml"}) public class TestValidation extends AbstractTestNGSpringContextTests { public void testNullParamValidation() { // Testing code goes here! } }
Spring和TestNG可以很好地协同工作,但有一些事情需要注意。 除了inheritanceAbstractTestNGSpringContextTests之外,您还需要了解它如何与标准TestNG setup / teardown注释交互。
TestNG有四个级别的设置
- BeforeSuite
- BeforeTest
- 课前
- BeforeMethod
这与您所期望的完全一样(自我loggingAPI的一个很好的例子)。 这些都有一个名为“dependsOnMethods”的可选值,可以接受一个string或string[],这是同一级别的方法的名称或名称。
AbstractTestNGSpringContextTests类有一个名为springTestContextPrepareTestInstance的BeforeClass注解方法,如果您在其中使用自动assembly类,则必须设置您的安装方法。 对于方法,您不必担心自动assembly,因为在类方法中设置testing类时会发生这种情况。
这留下了如何在用BeforeSuite注释的方法中使用自动assembly类的问题。 你可以通过手动调用springTestContextPrepareTestInstance来做到这一点 – 虽然没有默认设置,但我已经成功地做了好几次了。
所以,为了说明,奥雅纳的例子的修改版本:
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.testng.AbstractTestNGSpringContextTests; import org.testng.annotations.Test; @Test @ContextConfiguration(locations = {"classpath:applicationContext.xml"}) public class TestValidation extends AbstractTestNGSpringContextTests { @Autowired private IAutowiredService autowiredService; @BeforeClass(dependsOnMethods={"springTestContextPrepareTestInstance"}) public void setupParamValidation(){ // Test class setup code with autowired classes goes here } @Test public void testNullParamValidation() { // Testing code goes here! } }