这可能是错误的编码方式,但是可以理解应该怎么做。
我有一个此类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的作者)