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); 
} 
} 
InformationsquelleAutor icats | 2011-06-03
Schreibe einen Kommentar