弹簧自动装配上的NPE形成TestExecutionListener

时间:2017-10-13 06:54:31

标签: java spring unit-testing junit4 spring-test

这可能是错误的编码,但任何想法应该如何完成都值得赞赏。

我有这个类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
}

1 个答案:

答案 0 :(得分:3)

对于初学者来说,让测试类实现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的作者