Spring依赖项没有被注入到BeforeSuite方法中?

时间:2017-03-23 22:53:45

标签: java spring unit-testing testng

我正在运行一个使用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注释时它们被注入方法中。

有什么想法吗?我真的很感激!

2 个答案:

答案 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();  
}

希望这可以帮助您注入依赖项。