无法加载Spring应用上下文

4

我正在为一个相当复杂的Spring应用编写单元测试。我希望加载Spring上下文以使用定义的Bean。我的context.xml位于:

src/main/resources/context.xml

在Maven编译后,context.xml会出现在以下位置:
target/classes/context.xml

在pom.xml文件中,我有以下内容:(正如这篇文章所建议的)
<resources>
    <resource>
        <filtering>true</filtering>
        <directory>src/test/resources</directory>
        <includes>
            <include>**/*.properties</include>
        </includes>
        <excludes>
            <exclude>**/*local.properties</exclude>
        </excludes>
    </resource>
    <resource>
        <directory>src/main/resources</directory>
        <includes>
            <include>**/*.properties</include>
            <include>**/*.xml</include>
        </includes>
    </resource>
</resources>

我尝试用两种方法来完成这项工作:

1, Use ApplicationContext
AppliactionContext springContext = new ClassPathXmlApplicationContext("/context.xml");
MyObject myObject = springContext.getBean(myObject.class);

2, Use Annotations
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"/context.xml"})
public class myTest{
    @Autowired
    MyObject myObject;
    ...
}

但是这两种方法都对我无效。错误信息:
java.lang.IllegalStateException: Failed to load ApplicationContext
at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:157)
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:211)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:288)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:290)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
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) 
...  more

重要提示:context.xml实际上是从另一个项目复制过来的。这些项目一起运行作为应用程序,但在作为Junit运行时,我不知道如何从不同的项目中加载上下文,所以我只是复制并粘贴了文件。这可能会成为一个问题。

更多信息 失败跟踪:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean
with name 'validator' defined in class path resource [context.xml]: BeanPostProcessor
before instantiation of bean failed; nested exception is    
java.lang.NoClassDefFoundError: org.aspectj.lang.annotation.Aspect

Caused by: java.lang.NoClassDefFoundError: org.aspectj.lang.annotation.Aspect

Caused by: java.lang.ClassNotFoundException: org.aspectj.lang.annotation.Aspect

看起来我需要先引入一些Spring AOP包?

请给出建议。非常感谢。

1个回答

6
当使用Spring测试注释运行作为junit测试时,您需要在类似于此的位置使用classpath
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:/context.xml")

我不在pom.xml中使用任何资源定义。您可以删除它并尝试以下操作。


你能分享一下你的context.xml文件吗? - Dhanush Gopinath
抱歉,这是机密信息。可能的问题是context.xml实际上并不属于这个项目。我将其复制到了src/main/resources中。我会在问题中澄清。 - Edmond
1
你复制的上下文可能正在加载不在你的类路径中的类和其他上下文xml,这也可能导致无法加载ApplicationContext错误。 - Dhanush Gopinath
那是一个好建议。我已经清理了我的context.xml,删除了所有不必要的东西。您能否请查看更新后的问题? - Edmond
1
新的错误提示说你的类路径中没有Spring Aspect jars。请将它们添加到你的pom.xml文件中,然后再试一次。 - Dhanush Gopinath
1
是的,那就是问题所在。我应该更仔细地阅读错误跟踪信息。感谢您的解决方案。 - Edmond

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接