使用 TestNG 进行 Spring 依赖注入
Posted
技术标签:
【中文标题】使用 TestNG 进行 Spring 依赖注入【英文标题】:Spring Dependency Injection with TestNG 【发布时间】:2011-02-06 04:51:41 【问题描述】:Spring 很好地支持 JUnit:
使用RunWith
和ContextConfiguration
注释,看起来非常直观
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:dao-context.xml")
此测试将能够在 Eclipse 和 Maven 中正确运行。 我想知道TestNG是否有类似的东西。我正在考虑迁移到这个“下一代”框架,但我没有找到适合使用 Spring 进行测试的匹配项。
【问题讨论】:
【参考方案1】:它也适用于 TestNG。您的 test 类需要扩展以下类之一:
org.springframework.test.context.testng.AbstractTestNGSpringContextTests
org.springframework.test.context.testng.AbstractTransactionalTestNGSpringContextTests
【讨论】:
谢谢。这正是我正在寻找的。span> 真是一团糟。首先强制执行特定的类层次结构。其次是相当混乱,因为使用@Transactional
的测试用例可能会错误地扩展非事务版本。但不幸的是,没有其他方法可以将 Spring 与 TestNG 一起使用。
@GrzesiekD。我希望在 4.5 年内有些事情可能会发生变化。 :) 所以请重新检查现状。
第一个对我不起作用,但第二个没问题。那么有和没有事务有什么区别呢?【参考方案2】:
这是一个对我有用的例子:
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!
【讨论】:
@Test 类的注释? :o【参考方案3】:Spring 和 TestNG 可以很好地协同工作,但是需要注意一些事项。除了继承 AbstractTestNGSpringContextTests
之外,您还需要了解它如何与标准 TestNG 设置/拆卸注释进行交互。
TestNG 有四个级别的设置
BeforeSuite 测试前 课前 之前的方法这完全符合您的预期(自记录 API 的绝佳示例)。这些都有一个名为dependsOnMethods
的可选值,它可以采用String 或String[],这是同一级别的方法的名称。
AbstractTestNGSpringContextTests
类有一个 BeforeClass
注释方法,称为 springTestContextPrepareTestInstance
,如果您在其中使用自动装配类,您必须将设置方法设置为依赖于该方法。对于方法,你不必担心自动装配,因为它发生在测试类设置在类之前的方法中。
这只是留下了一个问题,即如何在使用BeforeSuite
注释的方法中使用自动装配类。您可以通过手动调用 springTestContextPrepareTestInstance
来执行此操作 - 虽然默认情况下没有设置执行此操作,但我已经成功完成了几次。
因此,为了说明,Arup 示例的修改版本:
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!
【讨论】:
方法 org.springframework.test.context.testng.AbstractTestNGSpringContextTests#springTestContextPrepareTestInstance 已经有注释 @BeforeClass 所以这个解决方案在我看来是多余的。 此解决方案允许您向测试中添加与自动连线字段相关的代码。 “springTestContextPrepareTestInstance”作为“类前”方法并不能保证它会在子类的“前类”之前运行——您需要显式设置dependOnMethods字段 不幸的是,这对我不起作用。默认情况下,@Autowire
似乎发生得很晚,在@BeforeTest 之后(但在@Test 之前)。我尝试添加dependsOnMethods,但后来我得到:MyClass 取决于方法受保护的void org.springframework.test.context.testng.AbstractTestNGSpringContextTests.springTestContextPrepareTestInstance() 抛出java.lang.Exception,它没有用@Test 注释...
编辑:刚刚找到一个解决方案(问题是 BeforeSuite 不适用于此)。检查:***.com/questions/5192562/…以上是关于使用 TestNG 进行 Spring 依赖注入的主要内容,如果未能解决你的问题,请参考以下文章