Junit4 выдает исключение при тестовом запуске

Я использую Struts2, Spring3 и JPA для своего приложения. Когда я использую junit, он работает так, как ожидалось, но единственная проблема - это определяемый пользователем тест исключения.

код для вызова формы действия Test

@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:ApplicationContext.xml"}) открытый класс HelloWorldTest расширяет StrutsSpringJUnit4TestCase {

public HelloWorldTest() {
}
> @Test
>     public void testGetString2() throws Exception {
>         HelloWorld helloWorld = new HelloWorld();
>         String result = executeAction("/helloworld.action");
>         String s = helloWorld.getString("Test");         
>         assertEquals("Test", this);
>     }

мой файл WEB.XML.

> <context-param>
>         <param-name>contextConfigLocation</param-name>
>         <param-value>            
>             /WEB-INF/applicationContext.xml
>         </param-value>
>     </context-param>
>     <filter>
>         <filter-name>struts2</filter-name>
>         <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
>     </filter>
>     <listener>
>         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
>     </listener>
>     <filter-mapping>
>         <filter-name>struts2</filter-name>
>         <url-pattern>/*</url-pattern>
>     </filter-mapping>
>     <welcome-file-list>
>         <welcome-file>index.jsp</welcome-file>
>     </welcome-file-list>

и мой файл applicationContext

> <beans>
>         <bean id="helloWorldClass" class="com.junitaction.HelloWorld" > 
>         </bean>
>     </beans>

Получение ошибки вроде.

java.lang.NullPointerException в org.apache.struts2.StrutsJUnit4TestCase.executeAction(StrutsJUnit4TestCase.java:134) в com.junitaction.HelloWorldTest.testGetString2(HelloWorldTest.java:76) в org.springframework.test.context.junit4.statements. RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74) в org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83) в org.springframework.test.context.junit4.statements.SpringRepeat.evaluate SpringRepeat.java:72) в org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231) в org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88) в org .springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) в org.springframework.test.context.junit4.statement s.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71) в org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)

Файл Struts.xml

<struts>    
    <!-- Configuration for the default package. -->
    <package name="default" extends="struts-default">
        <action name="helloworld" class="helloWorldClass">
            <result>/success.jsp</result>
        </action>
    </package>
</struts>

как я могу вызвать actionClass из junit4... пожалуйста, помогите мне улучшить. мои файлы jar:

antlr-2.7.2.jar, asm-3.3.jar, commons-fileupload-1.3.jar, commons-io-2.0.1.jar, commons-lang-2.4.jar, commons-lang3-3.1.jar, commons- logging-1.1.3.jar, freemarker-2.3.19.jar, javassist-3.11.0.GA.jar, ognl-3.0.6.jar, org.springframework.web.servlet-3.2.3.RELEASE.jar, spring-aop-3.2.3.RELEASE.jar, spring-aspects-3.2.3.RELEASE.jar, spring-beans-3.2.3.RELEASE.jar, spring-context-3.2.3.RELEASE.jar, spring- контекстная поддержка-3.2.3.RELEASE.jar, spring-core-3.2.3.RELEASE.jar, spring-expression-3.2.3.RELEASE.jar, spring-test-3.2.3.RELEASE.jar, spring- web-3.2.3.RELEASE.jar, struts2-core-2.3.15.1.jar, struts2-junit-plugin-2.3.15.1.jar, struts2-spring-plugin-2.3.15.1.jar, xwork-core-2.3. 15.1.бан.


person Hariprasath    schedule 26.08.2013    source источник


Ответы (1)


Проблема в том, что вы смешиваете JUnit3 и JUnit4... StrutsSpringTestCase - это тестовый пример на основе JUnit3, где аннотация @Test взята из JUnit4. Смешивание этих тонкостей в одном тесткейсе не сработает.

Либо переключите весь тестовый пример на настройку на основе JUnit4 (путем расширения класса StrutsSpringJUnit4TestCase, как указано в комментариях). Или перепишите свой тестовый метод, чтобы он был тестом на основе JUnit3 (т.е. без аннотаций и попытки/поймать).

public void testSomeMethod() throws AccessDeniedException {
  try {
    throw new health.exception.AccessDeniedException("AccessDeniedException");
  } catch (Exception e) {
    Assert.assertTrue(e instanceof health.exception.AccessDeniedException);
  }
}  
person M. Deinum    schedule 26.08.2013
comment
я думаю, что try catch не является стандартным способом сделать исключение, определяемое пользователем. правильный способ сделать пользовательское исключение в Junit4 показан в моем коде. - person Hariprasath; 26.08.2013
comment
Однако для JUnit4 это правильно, как я уже упоминал, вы смешиваете JUnit3 и JUnit4, и это просто не сработает. SO либо полностью переключитесь на JUnit4, либо используйте подход JUnit3 (как я уже упоминал в своем ответе). - person M. Deinum; 26.08.2013
comment
+1 Примечание. Также в реальном тесте вам, вероятно, нужно использовать Assert.fail() после строки, которая может вызвать исключение. - person Aleksandr M; 26.08.2013
comment
Это, вероятно, привело бы к ошибке компиляции, это был бы недостижимый код. - person M. Deinum; 26.08.2013
comment
@M.Deinum: я имел в виду тест в реальной жизни, когда вы вызываете какой-то метод, который может вызвать это исключение. А не бросать напрямую, как в этом примере. - person Aleksandr M; 26.08.2013
comment
Это был код, который вы разместили, и поэтому я изменил тестовый код. В JUnit3 вы должны поймать исключение и потерпеть неудачу, если исключения нет. В JUnit4 есть лучшие способы, но не в JUnit3. - person M. Deinum; 27.08.2013
comment
когда я использую StrutsSpringJUnit4TestCase, возникает исключение исключения nullpointer. Как я могу разрешить это исключение. Я использую метод executeAction для вызова действия. - person Hariprasath; 02.09.2013
comment
Опубликуйте свою новую конфигурацию (обновите свой вопрос) и настройте. Не видя трудно сказать. Я предполагаю, что вы не используете экземпляр bean-компонента, управляемый Spring, где вы должны (например, создать новый самостоятельно). И опубликуйте полную трассировку стека. - person M. Deinum; 02.09.2013
comment
я обновил свой код, я получаю нулевой указатель при вызове класса действия. - person Hariprasath; 02.09.2013
comment
Либо ваше действие делает что-то не так (или ничего), при условии, что я просмотрел правильный исходный код, метод response.getContentAsString возвращает null (из MockHttpServletResponse), что заставляет меня поверить, что ваше действие неверно или неправильно настроено. Убедитесь, что ваша конфигурация struts прочитана и что она ссылается на сконфигурированный bean-компонент Spring! Взгляните на это руководство. - person M. Deinum; 02.09.2013
comment
но я могу запустить в браузере, в нем нет ошибок - person Hariprasath; 02.09.2013
comment
есть ли другой способ вызвать действие. - person Hariprasath; 02.09.2013
comment
Вместо фрагментов опубликуйте свой полный тестовый пример и трассировку стека, а также убедитесь, что ваша конфигурация struts правильно загружена тестовым набором (по умолчанию он загружает только файл struts-default.xml). - person M. Deinum; 02.09.2013