AbstractTestExecutionListener

AbstractTestExecutionListener

这可能是错误的编码方式,但是可以理解应该怎么做。



我有一个此类TestClass,它需要注入许多服务类。由于无法在@BeforeClass对象上使用@Autowired,因此导致使用AbstractTestExecutionListener。一切都按预期工作,但是当我在@Test块上时,所有对象都被评估为null

任何想法如何解决这个问题?

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { ProjectConfig.class })
@TestExecutionListeners({ TestClass.class })
public class TestClass extends AbstractTestExecutionListener {

    @Autowired private FirstService firstService;
    // ... other services

    // objects needs to initialise on beforeTestClass and afterTestClass
    private First first;
    // ...

    // objects needs to be initialised on beforeTestMethod and afterTestMethod
    private Third third;
    // ...

    @Override public void beforeTestClass(TestContext testContext) throws Exception {
        testContext.getApplicationContext().getAutowireCapableBeanFactory().autowireBean(this);

        first = firstService.setUp();
    }

    @Override public void beforeTestMethod(TestContext testContext) throws Exception {
        third = thirdService.setup();
    }

    @Test public void testOne() {
        first = someLogicHelper.recompute(first);
        // ...
    }

    // other tests

    @Override public void afterTestMethod(TestContext testContext) throws Exception {
        thirdService.tearDown(third);
    }

    @Override public void afterTestClass(TestContext testContext) throws Exception {
        firstService.tearDown(first);
    }

}

@Service
public class FirstService {
    // logic
}

最佳答案

对于初学者来说,让测试类实现AbstractTestExecutionListener并不是一个好主意。 TestExecutionListener应该在独立的类中实现。因此,您可能需要重新考虑这种方法。

无论如何,您当前的配置都已损坏:您禁用了所有默认的TestExecutionListener实现。

要包括默认值,请尝试以下配置。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = ProjectConfig.class)
@TestExecutionListeners(listeners = TestClass.class, mergeMode = MERGE_WITH_DEFAULTS)
public class TestClass extends AbstractTestExecutionListener {
    // ...
}


问候,

Sam(Spring TestContext Framework的作者)

09-05 17:18