2014-10-20 68 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类