我正在运行一个使用TestNG作为测试框架的spring启动应用程序。我的测试设置如下:
父类,负责设置逻辑并负责所有配置事项:
@ContextConfiguration(classes = {TestingConfig.class}, initializers = ConfigFileApplicationContextInitializer.class)
@ContextConfiguration(classes = TestConfig.class)
@TestPropertySource(locations = "classpath:application.yml")
public abstract ParentTestClass extends AbstractTestNGSpringContextTests {
@Autowired
private ServiceClient serviceClient;
@BeforeSuite
public void beforeClass() {
Assert.assertNotNull(serviceClient);
serviceClient.doSomeSetupWork();
}
}
有多个子测试类。每个on继承形成父测试类,以便它们共享相同的设置逻辑。
public ChildTestClass1 extends ParentTestClass {
@Test
public void someTest() {
...
}
// More tests not shown
}
public ChildTestClass2 extends ParentTestClass {
@Test
public void anotherTest() {
...
}
// More tests not shown
}
serviceClient
是测试套件所依赖的其中一个Web服务的客户端。我正在与服务客户端进行调用,以便在运行测试用例之前在其他服务中设置数据。
问题在于:之前我使用的是@BeforeClass
注释,这意味着父类的设置方法正在为每个子测试类运行一次。这没关系,但是等待相同的设置多次运行真的很慢。
所以我想我自己:我只是将ParentTestClass中的@BeforeClass
注释改为@BeforeSuite
而不是!这将解决我的所有问题!
错误。
现在,当我运行它时,父类的Assert.assertNotNull(serviceClient);
方法中的beforeClass()
行失败。 简而言之,Spring依赖关系不会被注入到@BeforeSuite注释方法中,甚至在用@BeforeClass
注释时它们被注入方法中。
有什么想法吗?我真的很感激!
答案 0 :(得分:3)
我相信这是按设计工作的。通过查看如何在org.springframework.test.context.testng.AbstractTestNGSpringContextTests
(从中扩展)中构建实现,依赖项将通过org.springframework.test.context.support.DependencyInjectionTestExecutionListener#injectDependencies
(这是一个侦听器)注入到测试类中。
包括DependencyInjectionTestExecutionListener
在内的所有听众仅通过org.springframework.test.context.testng.AbstractTestNGSpringContextTests#springTestContextPrepareTestInstance
分类方法@BeforeClass(alwaysRun=true)
调用。
因此,除非此@BeforeClass
带注释的方法运行完成,否则您无法使用您的依赖项。因此,您必须移出@BeforeSuite
方法,并仅使用@BeforeClass
注释。
如果您不需要多次完成服务设置,则需要在测试代码中添加编辑检查,以执行设置仅在其未完成时。
答案 1 :(得分:0)
这是您所有问题的解决方案。
@Override
@BeforeSuite
protected void springTestContextPrepareTestInstance() throws Exception {
super.springTestContextPrepareTestInstance();
}
希望这可以帮助您注入依赖项。