如果在JUnit和&amp ;;中使用测试监听器,则自动装配不起作用。弹簧

时间:2015-10-06 20:04:13

标签: java spring junit4

我发现,取消注释测试监听器注释会导致测试无法在下面工作(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();
   }
}

为什么?

1 个答案:

答案 0 :(得分:2)

当您提供@TestExecutionListeners注释时,您将覆盖TestExecutionListener类型的默认列表,其中包括处理依赖项注入的DependencyInjectionTestExecutionListener

默认类型在TestExecutionListener javadoc:

中声明
  

Spring提供了以下开箱即用的实现(全部   实现Ordered):

     
      
  • ServletTestExecutionListener
  •   
  • DependencyInjectionTestExecutionListener
  •   
  • DirtiesContextTestExecutionListener
  •   
  • TransactionalTestExecutionListener
  •   
  • SqlScriptsTestExecutionListener
  •   

也要注册那些。或者使用Spring documentation

中列出的技术合并您的默认值和默认值
  

为避免必须知道并重新声明所有默认侦听器,   mergeMode的{​​{1}}属性可以设置为   @TestExecutionListenersMergeMode.MERGE_WITH_DEFAULTS表示   本地声明的侦听器应与默认值合并   听众。

所以你的注释看起来像是

MERGE_WITH_DEFAULTS