用TestNG进行Springdependency injection

Spring支持JUnit:使用RunWithContextConfiguration注解,事情看起来非常直观

 @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! } }