@Autowired JUnit测试

时间:2014-10-20 09:58:26

标签: java spring junit autowired

我使用过JUnit,但有些测试有一些问题,这些测试在Spring bean中都有@Autowired注释,当我引用它们时,@Autowired的bean总是为NULL。

以下是示例代码:

     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
    }

当调用Manager对象时,Spring会生成代理,但是当访问@Autowired parameterManager时,对象为null,出现此问题我无法测试此方法。

知道造成这种情况的原因是什么?为什么没有注入物体?它在Web应用程序的上下文中运行良好,但在测试上下文中始终为NULL。

3 个答案:

答案 0 :(得分:2)

尝试使用弹簧滑块运行单元测试。

@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类

答案 1 :(得分:1)

我终于找到了解决问题的方法。 找到这篇文章SpringBeanAutowiringSupport does not inject beans in jUnit tests并执行类似JUnit测试的工作。

答案 2 :(得分: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
}