2014-10-20 66 views
1

我使用JUnit,但有些測試有一些問題,這些測試在Spring bean中有@Autowired註釋,當我引用它們時,@Autowired的bean始終爲NULL。@Autowired with JUnit tests

下面是示例代碼:

 public class Test { 

       protected ApplicationContext ac; 

       @Before 
       public void setUp() { 
        ac = new FileSystemXmlApplicationContext("classpath:config/applicationContext.xml" 
        "classpath:config/test-datasources.xml"); 
       } 

       @Test 
       public void testRun() throws Exception { 
         IManager manager = (IManager)this.ac.getBean("manager"); 
         manager.doSomething(); 
       } 
    } 

    @Service 
    public class Manager implements IManager { 

      public boolean doSomething() throws Exception { 
       ParametersJCSCache parametersJCSCache = new ParametersJCSCache(); 
       String paramValue = parametersJCSCache.getParameter("XPTO"); 
       ... 
      } 
    } 

    public class ParametersJCSCache extends SpringBeanAutowiringSupport { 

      @Autowired 
      private IParameterManager parameterManager; //THIS IS NULL 
    } 

當調用管理器對象的彈簧產生的代理,但訪問@Autowired parameterManager當對象爲空,並用這個問題我不能測試此方法。

任何想法是什麼造成這種情況?爲什麼對象沒有被注入?它在Web應用程序的上下文中運行良好,但在測試上下文中始終爲NULL。

回答

0

在我看來像ParametersJCSCache不是Spring管理bean。你需要讓這個一個Spring bean,並將其自動裝配到Manager

@Service 
     public class Manager implements IManager { 

       public boolean doSomething() throws Exception { 
        ParametersJCSCache parametersJCSCache = new ParametersJCSCache(); <-- You create a new (non Spring-managed) instance 
        String paramValue = parametersJCSCache.getParameter("XPTO"); 
        ... 
       } 
     } 

更改爲:

@Service 
public class Manager implements IManager { 

     @Autowired 
     private ParametersJCSCache parametersJCSCache; 

     public boolean doSomething() throws Exception { 
      String paramValue = parametersJCSCache.getParameter("XPTO"); 
      ... 
     } 
} 

@Component 
public class ParametersJCSCache extends JCSCache { 

     @Autowired 
     private IParameterManager parameterManager; //THIS IS NULL 
} 
+0

正確。那爲什麼我使用Autowired,如果ParametersCache是​​一個彈簧託管bean,我不需要Autowired Manager bean。這在Web應用程序上下文中起作用。 – bigster 2014-10-20 10:16:43

+0

如果ParametersJCSCache是​​一個非Spring的託管bean,Spring怎麼可以注入IParameterManager? – 2014-10-20 10:18:37

+0

這就是神祕感,當我在web上下文中調用相同的代碼時,這會起作用。使用JUnit不會得到相同的行爲。 ParametersJCSCache類擴展了SpringBeanAutowiringSupport。忘記把它放在代碼中。 – bigster 2014-10-20 10:28:39

1

嘗試用彈簧亞軍,而不是運行單元測試。

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"classpath:config/applicationContext.xml", 
       "classpath:config/test-datasources.xml"}) 
public class MyTest { 

    @Autowired private IManager manager; 

    @Test public void someTest() { 
    assertNotNull(manager); 
    } 
} 

它會載入配置只有一次,在需要的時候,它會自動裝配你的JUnit類