Java @自动连接JUnit测试
我使用过JUnit,但是有些测试有一些问题,这些测试在Springbean中有@Autowired注释,当我引用它们时,@Autowired的bean总是空的 下面是示例代码: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() {
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);
}
}