Java @自动连接JUnit测试

Java @自动连接JUnit测试,java,spring,junit,autowired,Java,Spring,Junit,Autowired,我使用过JUnit,但是有些测试有一些问题,这些测试在Springbean中有@Autowired注释,当我引用它们时,@Autowired的bean总是空的 下面是示例代码: public class Test { protected ApplicationContext ac; @Before public void setUp() {

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

下面是示例代码:

     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应用程序的上下文中运行良好,但在测试上下文中总是空的。

在我看来,ParametersJCCache不是Spring管理的bean。您需要将其设置为Springbean,并将其自动连接到管理器中

@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");
                     ...
                }
        }

试着用spring runner运行单元测试

@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类。我终于找到了解决问题的方法。
找到这篇文章,做一些类似的事情,JUnit测试可以正常工作。

正确。这就是为什么我使用Autowired,如果ParametersCache是spring管理的bean,我不需要自动连接Manager bean。这在Web应用程序上下文中起作用。如果ParametersJCCache是一个非Spring管理的bean,那么Spring究竟如何注入IParameterManager?这是个谜,当我在Web上下文中调用相同的代码时,这就起作用了。使用JUnit不会得到相同的行为。参数SCCache类扩展了SpringBeanAutowiringSupport。忘了把它写进代码里。它的工作方式和你认为的不一样。@Alan:我们不能在测试中使用现有的自动连线配置吗?有办法吗?
@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);
   }
}