Struts 2 JUnit Plugin v2.2.3: Test-Klasse, die sich StrutsTestCase; 'Anfrage' ist null
Ich bin versucht, Struts2 JUnit-Plugin (v2.2.3 w/Struts2 v2.2.3) und führen Sie in einige Probleme.
Ich versucht, verwenden Sie die Struts2 JUnit-Plugin-Tutorial als Leitfaden. Die erste änderung, die ich vornehmen musste (nicht in der Anleitung) ist zu kommentieren meiner test-Klasse mit:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath*:applicationContext-test.xml"})
da war ich immer die Fehlermeldung, wenn Sie versuchen, um mein unit-test:
SEVERE: [56:51.239] ********** FATAL ERROR STARTING UP STRUTS-SPRING INTEGRATION **********
Looks like the Spring listener was not configured for your web app!
Nothing will work until WebApplicationContextUtils returns a valid ApplicationContext.
You might need to add the following to web.xml:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
SEVERE: [56:51.254] Dispatcher initialization failed
Dies ist anders als das tutorial - hat jemand wissen, warum ich brauchte, um dies zu tun?
Hatte ich auch hinzufügen, um die folgenden Frühjahr Gläser (ich habe die notwendige Struts2 Gläser enthalten in meinem classpath):
- spring-beans-2.5.6.jar
- spring-context-2.5.6.jar
- spring-core-2.5.6.jar
- spring-test-2.5.6.jar
- spring-web-2.5.6.jar
Ich nicht nutzen Spring, w/in meiner struts-app, aber ich vermute, diese Gläser sind nötig, um die mock request
Objekt und wie in der StrutsTestCase
.
Meine Test-Klasse:
package com.actions;
import java.io.UnsupportedEncodingException;
import java.util.List;
import javax.servlet.ServletException;
import org.apache.log4j.Logger;
import org.apache.struts2.StrutsTestCase;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.beans.LabelValueBean;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath*:applicationContext-test.xml"})
public class DocumentCategoryTest extends StrutsTestCase {
private static Logger log = Logger.getLogger(DocumentCategoryTest .class);
/**
* Testing RetrieveDocumentTypesForDocumentCategory
* Expecting the List<LabelValueBean> is not null
* @throws ServletException
* @throws UnsupportedEncodingException
*/
@Test
public void testRetrieveDocumentTypesForDocumentCategory() throws UnsupportedEncodingException, ServletException {
final String docCategory = "Employment";
//set parameters
request.setParameter("documentCategoryDescription", docCategory);
//execute the action
executeAction("/recipient/RetrieveDocumentTypesForDocumentCategory.action");
//retrieve the document types
@SuppressWarnings("unchecked")
List<LabelValueBean> testDocTypeList = (List<LabelValueBean>) findValueAfterExecute("documentTypes");
//make sure the document type list is not null and has at least one document type
assertNotNull(testDocTypeList);
assertTrue("At least one document type should exist for category 'Employment'", testDocTypeList.size() > 0);
//print types
log.debug("Document types for category '" + docCategory + "'");
log.debug(testDocTypeList);
}
}
Wenn ich die Aktion auszuführen, bekomme ich eine NullPointerException
auf die request.setParameter
Stück code:
java.lang.NullPointerException
at com.actions.DocumentCategoryTest.testRetrieveDocumentTypesForDocumentCategory(DocumentCategoryTest.java:38)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.test.context.junit4.SpringTestMethod.invoke(SpringTestMethod.java:160)
at org.springframework.test.context.junit4.SpringMethodRoadie.runTestMethod(SpringMethodRoadie.java:233)
at org.springframework.test.context.junit4.SpringMethodRoadie$RunBeforesThenTestThenAfters.run(SpringMethodRoadie.java:333)
at org.springframework.test.context.junit4.SpringMethodRoadie.runWithRepetitions(SpringMethodRoadie.java:217)
at org.springframework.test.context.junit4.SpringMethodRoadie.runTest(SpringMethodRoadie.java:197)
at org.springframework.test.context.junit4.SpringMethodRoadie.run(SpringMethodRoadie.java:143)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:160)
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.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:97)
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)
Dies ist, weil, aus irgendeinem Grund request
null, in StrutsTestCase
. Warum ist das so? Ich mache genau so, wie das tutorial vorschreibt!
Meine action-Klasse erweitert eine andere Klasse (BaseAction
) erstreckt ActionSupport
und implementiert SessionAware
.
package com.actions;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import com.actions.BaseAction;
/**
* Retrieves the document types for the passed in document category
*/
public class DocumentIndexingData extends BaseAction {
private static final long serialVersionUID = 1L;
private static Logger log = Logger.getLogger(DocumentIndexingData.class);
/*=========================================================================
* FIELDS
*=========================================================================*/
/**
* The description to use to look up the document types for that category
*/
private String documentCategoryDescription;
/**
* List of document types for a category
*/
private List<LabelValueBean> documentTypes;
/*=========================================================================
* PUBLIC METHODS
*=========================================================================*/
/**
* Retrieves & sets list of document types for document category with passed in ID
*
* @return If there is an error, document type will be set to ERROR; SUCCESS is always returned by this method
*/
public String retrieveDocumentTypesForDocumentCategory() {
List<LabelValueBean> docTypes = new ArrayList<LabelValueBean>();
//retrieve document types for passed in category ID
log.debug("looking up document types for category: " + getDocumentCategoryDescription());
////////////////
//retrieve the document types for the document category here...
////////////////
this.setDocumentTypes(docTypes);
log.debug("document types found: " + getDocumentTypes());
return SUCCESS;
}
/*=========================================================================
* GETTERS/SETTERS
*=========================================================================*/
/**
* Retrieves the list of document types
*
* @return list of document types
*/
public List<LabelValueBean> getDocumentTypes() {
return documentTypes;
}
/**
* Sets the list of document types
*
* @param documentTypes
*/
public void setDocumentTypes(List<LabelValueBean> documentTypes) {
this.documentTypes = documentTypes;
}
/**
* Retrieves the document category to retrieve document types for
*
* @return the document category
*/
public String getDocumentCategoryDescription() {
return documentCategoryDescription;
}
/**
* Sets the document category to retrieve document types for
*
* @param documentCategoryDescription the document category to retrieve document types for
*/
public void setDocumentCategoryDescription(String documentCategoryDescription) {
this.documentCategoryDescription = documentCategoryDescription;
}
}
struts.xml Eintrag:
<!-- indexing attributes action -->
<action name="RetrieveDocumentTypesForDocumentCategory" class="com.actions.DocumentIndexingData" method="retrieveDocumentTypesForDocumentCategory">
<result type="json">
<param name="root">documentTypes</param>
</result>
</action>
Ich bin nach dem tutorial ziemlich eng, warum ist request
null? Vielen Dank für jede Hilfe!!!
UPDATE (Meine Lösung! via @Alex):
Ich habe jetzt nur die folgende Struts-JARs auf meinen classpath:
- struts2-junit-plugin-2.2.3.jar
- spring-beans-2.5.6.jar
- spring-context-2.5.6.jar
- spring-core-2.5.6.jar
- spring-test-2.5.6.jar
- spring-web-2.5.6.jar
Probe-test:
public class MyTest extends StrutsTestCase { @Test public void testMyAction() throws Exception { Anfrage.setParameter("aParameter", "aValue"); //erstellen Aktion-proxy ActionProxy proxy = getActionProxy("/test/MyAction"); assertNotNull(proxy); MyAction action = (MyAction) proxy.getAction(); assertNotNull(Aktion); //ausführen der Aktion String result = proxy.execute(); //stellen Sie Behauptungen, in der Erwartung, Erfolg und keine Fehler messags assertTrue("sollte Es keine Fehler im Feld:" + Aktion.getFieldErrors(), Aktion.getFieldErrors().size() == 0); assertTrue("sollte Es keine Aktion Fehler:" + Aktion.getActionErrors(), Aktion.getActionErrors().size() == 0); assertEquals("Ergebnis passten nicht zu dem erwarteten Wert; ", der Aktion.ERFOLG, Ergebnis); } }
Du musst angemeldet sein, um einen Kommentar abzugeben.
Angesichts der Ausnahme der Nachrichten, die Sie sehen, über Ihre Anwendung und glaubt, dass es Spring verwendet. Sie haben die Struts2-Feder-Plugin auf Ihrem classpath? Wenn Sie nicht mit Spring für IoC dann sollten Sie nicht auch auf Ihrer classpath.
Sollten Sie in der Lage sein zu testen, Ihre Aktionen, indem Sie die folgenden guide haben Sie verwiesen, ohne jedes Frühjahr Gläser, wenn Sie nicht Frühling. Versuchen Sie, alle der Frühling-Gläser und die struts2-Feder-plugin jar. Sie sicherlich auch nicht brauchen:
in der test-Klasse, wenn Sie nicht Frühling.
Überprüfen Sie auch, dass Ihre struts.xml nicht enthalten diese Zeile:
<constant name="struts.objectFactory"
value="org.apache.struts2.spring.StrutsSpringObjectFactory"/>