【发布时间】:2014-04-09 20:01:53
【问题描述】:
这是一个关于 Spring 和创建应用程序上下文的一般问题。
我正在为网站应用程序进行单元测试。该网站使用 Spring 和 Hibernate,我想使用数据库中的一些数据进行测试。我不知道如何将 Spring IOC 容器连接到我的单元测试。我知道 applicationContext.xml 的位置,但是如何在单元测试中访问它的 bean?
这是我的代码:
package com.example.test;
import junit.framework.Assert;
import org.hibernate.SessionFactory;
import org.hibernate.classic.Session;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
public class SessionFactoryTest {
@Autowired
SessionFactory sessionFactory;
@Test
public void testSessionFactoryAutowiring() {
Session session = sessionFactory.getCurrentSession();
Assert.assertEquals(session.getClass(),Session.class);
}
}
哪个会产生错误
Testsuite: com.example.test.SessionFactoryTest
Tests run: 1, Failures: 0, Errors: 1, Time elapsed: 0.011 sec
Testcase: testSessionFactoryAutowiring took 0.002 sec
Caused an ERROR
null
java.lang.NullPointerException
at com.example.test.SessionFactoryTest.testSessionFactoryAutowiring(SessionFactoryTest.java:19)
现在我的问题是,如何从普通的 applicationContex.xml 访问 sessionFactory?如何访问容器?我不介意创建自己的,但是到今天结束时,我真的很想编写单元测试。谁不会?
更新:我确实根据 Spring 文档将注释添加到我的测试类中
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
但是找不到文件,我不知道如何指定与我的测试相关的文件。
Testsuite: com.example.test.SessionFactoryTest
Tests run: 1, Failures: 0, Errors: 1, Time elapsed: 0.045 sec
Testcase: testSessionFactoryAutowiring took 0.035 sec
Caused an ERROR
Failed to load ApplicationContext
java.lang.IllegalStateException: Failed to load ApplicationContext
at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:308)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75)
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:321)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:220)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:301)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:303)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:240)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180)
Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [applicationContext.xml]; nested exception is java.io.FileNotFoundException: class path resource [applicationContext.xml] cannot be opened because it does not exist
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:341)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:143)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:178)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:149)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:212)
at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:81)
at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:1)
at org.springframework.test.context.TestContext.loadApplicationContext(TestContext.java:280)
at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:304)
Caused by: java.io.FileNotFoundException: class path resource [applicationContext.xml] cannot be opened because it does not exist
at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:158)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:328)
我的项目结构如下:
src/
web/WEB-INF/applicationContext.xml
test/java/com/example/SessionFactoryTest.java
并且是用 ant 构建的。
【问题讨论】:
标签: java spring hibernate unit-testing junit