2012-06-21 3 views
4

Я работаю над приложением веб-службы весны 3, и на нем я пытаюсь загрузить ApplicationContext из моего файла servlett.xml для использования с простым тестовым примером, и он не работает.ApplicationContext всегда null

ApplicationContext всегда null.

это мой тестовый код:

@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 равно нулю. Я хочу в основном загрузить мои компоненты в этот тестовый пример и использовать их здесь, но autwiring объект класса 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: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 ниже:

<?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> 

Что мне не хватает?

редактировать: я НПЖ получаю эту ошибку в консоли вывода

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 с помощью JUnit 4.4 вместо. Теперь мы вернемся к оригинальной проблеме в отношении 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) укажите полное имя пути. ИМО намного проще использовать ресурс classpath. –

+0

Вы можете увидеть журнал, пока ваше приложение пытается создать «ApplicationContext»? Должна быть некоторая ошибка, и вы можете получить помощь из этого журнала. –

+0

Я указал полный путь в разделе «файл: 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 { 
    ... 
} 

Это, по крайней мере, дать вам протоколирование, так будет легче увидеть, что происходит. Либо это неправильный путь к файлу, либо проблема внутри определения контекста, например. неверное определение компонента.

NB: Nevermind абсолютный путь в моем примере, это было частью эксперимента - он должен действительно полагаться на местоположение classpath:.

UPDATE: Обновленный StackTrace предполагает, что вы не имеете API сервлетов на пути к классам при выполнении ваших тестов (java.lang.NoClassDefFoundError: javax/сервлет/ServletException). Не забудьте включить банку 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" }) 

Это сработало.