2012-06-21 330 views
4

我正在处理Spring 3 Web服务应用程序,并且正在尝试从我的servlett.xml文件加载ApplicationContext以用于简单的测试用例,但它不起作用。ApplicationContext始终为空

ApplicationContext始终为空。

这是我的测试代码:

@RunWith(SpringJUnit4ClassRunner.class) 
    @ContextConfiguration(locations = { "file:war/WEB-INF/FreedomSpring-servlett.xml" }) 
    public class UserControllerTest { 

     private UserController controller; 

     @Inject 
     private ApplicationContext applicationContext; 

     private String jsonUser = "{ \"username\":\"jonneymendoza\",\"emailAddress\":\"[email protected]\", \"password\":\"12345678\",\"firstName\":\"jono\", \"surname\":\"richy\", \"country\":\"united kingdom\",\"bio\":\"Bio stuff goes here about the user. where he comes from etc etc. all is well. lets go go go\" }"; 

     @Before 
     public void setup() { 
      controller = new UserController(); 

      assertNotNull(applicationContext); 

     } 

     @Test 
     public void testLogin() { 
      fail("Not yet implemented"); 
     } 

     @Test 
     public void testCreateNewAccount() { 

      ResponseEntity<String> response = controller 
        .createNewAccount(new HttpEntity<String>(jsonUser)); 
      assertEquals(HttpStatus.CREATED, response.getStatusCode()); 

     } 

     @Test 
     public void testGetUserProfile() { 
      fail("Not yet implemented"); 
     } 

    } 

它设置未按ApplicationContext已空。我想basicaly加载我的bean在这个测试用例上,并在这里使用它们,但自动装配UserService类对象,如下面在我的控制器类中所示。

@Controller 
public class UserController { 
    @Autowired 
    private UserService userService; 

xml文件定义我的服务豆:我失去了

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans  
     http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-3.1.xsd"> 

    <import resource="mvc-config.xml" /> 

    <import resource="service-config.xml" /> 

    <import resource="datasource-config.xml" /> 

    <bean id="propertyConfigurer" 
     class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="locations"> 
      <list> 
       <value>database.properties</value> 
      </list> 
     </property> 
    </bean> 

    <bean 
     class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" /> 

    <!-- Resolves views selected for rendering by @Controllers to .jsp resources 
     in the /WEB-INF/views directory --> 
    <bean id="viewResolver" 
     class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix" value="/WEB-INF/views/" /> 
     <property name="suffix" value=".jsp" /> 
    </bean> 

    <bean 
     class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /> 

    <context:component-scan base-package="com.jr.freedom.controllers"></context:component-scan> 


</beans> 

什么:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
     http://www.springframework.org/schema/mvc 
     http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd"> 


    <!-- Define services here--> 

    <bean id="userService" class="com.jr.freedom.user.UserService"></bean> 



</beans> 

servett下面?

编辑:我NPW得到在控制台输出

java.lang.NoSuchMethodError: org.junit.runner.notification.RunNotifier.testAborted(Lorg/junit/runner/Description;Ljava/lang/Throwable;)V at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:146) at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:61) at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:54) at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34) at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44) at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:52) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 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)

另一个编辑此错误:通过使用JUnit 4.4代替固定上述的junit错误。现在我们回到关于ApplicatyionContext的原始问题。

这是错误的堆栈跟踪每当我跑我的测试:

log4j:WARN No appenders could be found for logger (org.springframework.test.context.junit4.SpringJUnit4ClassRunner). 
log4j:WARN Please initialize the log4j system properly. 
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. 
java.lang.NoClassDefFoundError: javax/servlet/ServletException 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:615) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) 
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) 
    at java.net.URLClassLoader.access$000(URLClassLoader.java:58) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:197) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 
    at java.lang.Class.getDeclaredMethods0(Native Method) 
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2427) 
    at java.lang.Class.getDeclaredMethods(Class.java:1791) 
    at org.springframework.core.type.StandardAnnotationMetadata.hasAnnotatedMethods(StandardAnnotationMetadata.java:136) 
    at org.springframework.context.annotation.ConfigurationClassUtils.isLiteConfigurationCandidate(ConfigurationClassUtils.java:105) 
    at org.springframework.context.annotation.ConfigurationClassUtils.checkConfigurationClassCandidate(ConfigurationClassUtils.java:86) 
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:216) 
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:178) 
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:617) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:446) 
    at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:96) 
    at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:44) 
    at org.springframework.test.context.TestContext.buildApplicationContext(TestContext.java:198) 
    at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:233) 
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:126) 
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:85) 
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:231) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:95) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:139) 
    at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51) 
    at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44) 
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27) 
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37) 
    at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    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: java.lang.ClassNotFoundException: javax.servlet.ServletException 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 
    ... 42 more 
+0

如果您使用的是文件,您可能需要确保(a)您已明确设置测试执行目录,或(b)指定完整的路径名。 IMO使用类路径资源要容易得多。 –

+0

当你的应用程序试图构建'ApplicationContext'时,你能看到日志吗?必须有一些错误,并且您可以从该日志中获得帮助。 –

+0

我已经在“file:war/WEB-INF/FreedomSpring-servlett.xml”下指定了完整的路径名,但它似乎不起作用? – jonney

回答

0

看来,@RunWith(SpringJUnit4ClassRunner.class)注释丢失,或只是一个错误,当复制并粘贴?

2

不是一个真正的答案,但希望它会帮助你排除故障(它为我做的)。添加@RunWith(SpringJUnit4ClassRunner.class)到类像这样:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"file:///c:/project/target/META-INF/spring/applicationContext.xml"}) 
public class SpringContextTest { 
    ... 
} 

这将至少给你的日志,因此它会更容易,看看发生了什么事情。要么是不正确的文件路径,要么是上下文定义中的问题,例如一个无效的bean定义。

注:在我的例子中,绝对路径绝对没有,这是实验的一部分 - 它应该真的依赖于classpath:位置。

更新:更新的堆栈跟踪表明在运行测试时(java.lang.NoClassDefFoundError:javax/servlet/ServletException),您在类路径中没有Java Servlets API。确保在类路径中包含罐子servlet-api-2.5.jar(或类似的)。

+0

谢谢我添加@Runwith并在日志中得到这个错误: – jonney

+0

编辑检查编辑问题的日志 – jonney

+0

更新了答案 – maksimov

1

我也竭尽全力来应付这一问题3-4 hours..but最后当我加入了下面的代码,以我的测试类....

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "file:///D:/PRMS_Workspace/PRMS/WebContent/WEB-INF/dispatcher-servlet.xml" }) 

它的工作了。