我发现,取消注释测试监听器注释会导致测试无法在下面工作(autowired成员未初始化并且发生NullPointerException):
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestExecutionListenerTry2._Config.class)
//@TestExecutionListeners({TestExecutionListenerTry2._Listener.class})
public class TestExecutionListenerTry2 {
public static class Bean1 {
{
System.out.println("Bean1 constructor");
}
public void method() {
System.out.println("method()");
}
}
@Configuration
public static class _Config {
@Bean
public Bean1 bean1() {
return new Bean1();
}
}
public static class _Listener extends AbstractTestExecutionListener {
@Override
public void prepareTestInstance(TestContext testContext) throws Exception {
System.out.println("prepareTestInstance");
}
@Override
public void beforeTestClass(TestContext testContext) throws Exception {
System.out.println("beforeTestClass");
}
}
@Autowired
public Bean1 bean1;
@Test
public void testMethod() {
bean1.method();
}
}
为什么?
答案 0 :(得分:2)
当您提供@TestExecutionListeners
注释时,您将覆盖TestExecutionListener
类型的默认列表,其中包括处理依赖项注入的DependencyInjectionTestExecutionListener
。
默认类型在TestExecutionListener
javadoc:
Spring提供了以下开箱即用的实现(全部 实现
Ordered
):
ServletTestExecutionListener
DependencyInjectionTestExecutionListener
DirtiesContextTestExecutionListener
TransactionalTestExecutionListener
SqlScriptsTestExecutionListener
也要注册那些。或者使用Spring documentation
中列出的技术合并您的默认值和默认值为避免必须知道并重新声明所有默认侦听器,
mergeMode
的{{1}}属性可以设置为@TestExecutionListeners
。MergeMode.MERGE_WITH_DEFAULTS
表示 本地声明的侦听器应与默认值合并 听众。
所以你的注释看起来像是
MERGE_WITH_DEFAULTS