【问题标题】:Refer spring context file from another project: JUnit & Spring从另一个项目中引用 spring 上下文文件:JUnit 和 Spring
【发布时间】:2013-12-30 05:59:35
【问题描述】:

我有一个 Spring MVC project(contains Controller & jsp files)DAO project(Contains DB operation related files) & 两个项目都是使用注释配置的。 MVC 项目依赖于 DAO 项目。现在,我正在为 MVC 和 DAO 项目编写 JUnit 测试。因此,我创建了一个单独的“测试项目”,其中我将 MVC 项目添加为dependency(Java Build Path -> Projects tab -> Add -> MVC Project & ok),并包含所有需要的 jar 文件(JUnit 和 spring-test.jar)。
我的项目结构:

MVCProject (Depends on DAOProject --> Web App project)
    |
     WebContent
        |
         WEB-INF
            |
             spring-context.xml

DAOProject (Java project)
    |
     src  


TestProject(Depends on MVCProject --> Java project)
    |
     src (packages)
        |
         JunitTestClass.java

这是我的测试项目代码,

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"file:MVCProjectName/WebContent/WEB-INF/spring-context.xml"})
public class DAOImplTest {

    @Autowired
    private DAO dao;

    String id = null;

    /**
     * Test method for {@link com.xyz.core.dao.DAOImpl#getById(java.lang.String)}.
     */
    @Test
    public void testGetById() {

        id = "12345";
        try {
            dao.getById(id);
        } catch (Exception e) {         
            e.printStackTrace();
        }
    }
}  

我收到“找不到文件异常”,如下所示。

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.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:303)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:240)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
    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.junit.runners.ParentRunner.run(ParentRunner.java:236)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from URL [file:../../../../../../../RSPWebAPP/WebContent/WEB-INF/RoadSmartPro-servlet.xml]; nested exception is java.io.FileNotFoundException: MVCProjectName/WebContent/WEB-INF/spring-context.xml (The system cannot find the path specified.)
    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)
    ... 24 more
Caused by: java.io.FileNotFoundException: MVCProjectName/WebContent/WEB-INF/spring-context.xml (The system cannot find the path specified.)
    at java.io.FileInputStream.<init>(FileInputStream.java:149)
    at java.io.FileInputStream.<init>(FileInputStream.java:108)
    at sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:103)
    at sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:201)
    at org.springframework.core.io.UrlResource.getInputStream(UrlResource.java:124)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:328)
    ... 33 more  

但是,When I copy the spring-context.xml file from 'MVC project' into 'Test project' everything works fine。我将上下文文件复制到测试项目中的以下位置并且工作正常。

TestProject
      |_
         config(packageName)
         |_
            test-spring-context.xml  

及其对应的注解

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:config/test-spring-context.xml"})
public class DAOImplTest {
     .....
     ..... 
}

但我不想要这种方法,因为原始上下文文件 (spring-context.xml) 中的任何更改都不会反映在复制的文件 (test-spring-context.xml) 中。

有没有办法在“测试项目”中配置原始上下文文件?请提出一些建议。
提前致谢。

【问题讨论】:

    标签: spring spring-mvc junit junit4


    【解决方案1】:

    为什么不使用 Maven 继承模型?这是一个很好的用例,因为您希望您的测试与您的代码一起进行。此外,项目依赖项的任何更改都将使用 Maven 依赖项管理为您处理。我假设两个模块 MVC Project 和 DAOProject 打包在一起。

    参考: http://maven.apache.org/guides/introduction/introduction-to-the-pom.html#Project_Inheritance

    【讨论】:

    • 嗨,Hrishikesh,你是对的。 MVCProject 和 DAOProject 打包在一起,但不与 maven 打包在一起。它是一个现有项目,我们没有使用任何“项目管理工具”,如 maven 进行构建管理。我们有“企业应用程序项目”,其中将上述 2 个项目添加为它的依赖项,当我导出它时会生成 EAR 文件。请让我知道一些其他可用的选项。感谢您的快速回复。
    猜你喜欢
    • 2011-09-22
    • 2013-10-29
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    • 2011-10-08
    • 2017-11-14
    • 1970-01-01
    • 2014-02-09
    相关资源
    最近更新 更多