我使用过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。
答案 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
}