2011-01-17 5 views
1

Ich habe eine Frage zu Speicherverwaltung/Speicherlecks, die ich gerne klären würde.Minimierung der Objekterhaltung während der Komponententests

Set Up:

ich einige Servlet-Code mich entschieden, die HttpServletRequest und Httpresponse nimmt Referenzen Objekte HttpServletRequest # getParameter (String), HttpServletRequest # getHeader (String) und HttpServletRequest # getAttribute (String).

Ich schreibe Komponententests für den Servlet-Code. Um Tests zu ermöglichen, habe ich Stubs für HttpServletRequest und HttpServletResponse erstellt, die das Testen ermöglichen. Der Beispielcode ist unten angegeben:

public final class HttpServletRequestStub implements HttpServletRequest { 

    private Map<String, String> parameterMap = new HashMap<String, String>(); 
    private Map<String, String> headerMap = new HashMap<String, String>(); 
    private Map<String, String> attributeMap = new HashMap<String, String>(); 

    public void setParameter(String param, String value) { 
    this.parameterMap.put(param, value); 
    } 
    public void setHeader(String param, String value) { 
    this.headerMap.put(param, value); 
    } 
    @Override 
    public void setAttribute(String param, String value) { 
    this.attributeMap.put(param, value); 
    } 
    public void flush() { 
    this.parameterMap.clear(); 
    this.headerMap.clear(); 
    this.attributeMap.clear(); 
    } 

    @Override 
    public String getParameter (String parameter) { 
    return this.parameterMap.get(parameter); 
    } 
    @Override 
    public String getHeader(String parameter) { 
    return this.headerMap.get(parameter); 
    } 
    @Override 
    public String getAttribute(String attribute) { 
    return this.attributeMap.get(attribute); 
    } 

    .... Other stubbed methods 




} 

In meiner Unit-Test:

public class MyTest { 
    private MyServlet servlet; 

    private HttpServletRequest request; 

    private HttpServletResponse response; 

    @Before 
    public void setUp() throws Exception { 
     request = new HttpServletRequestStub(); 
     response = new HttpServletResponseStub(); // Not in the sample code but implemented. 
     servlet = new MyServlet(); 
    } 

    @After 
    public void tearDown() throws Exception { 
     request = null; 
     response = null; 
     servlet = null; 
    } 

    @Test 
    public void testFoo() throws Exception { 
    request.setParameter("foo", "bar"); 
    request.setAttribute("attrib", "attrib"); 
    request.setHeader("header", "header"); 
    servlet.service(request, response); 
    } 


} 

Meine Frage ist in Bezug auf die Speicherverwaltung. Ist es notwendig für mich, den gefälschten Header zu leeren, Karteninhalte nach der Testausführung anzufordern und zu kennzeichnen oder würde dies automatisch passieren, sobald die Anfrage, Antwortobjekte in meiner Abrißmethode dereferenziert werden (mit @After gekennzeichnet) ?. Müsste ich die flush-Methode explizit in meiner Abreißmethode aufrufen, um Speicherreferenzen zu löschen? Ich dachte, dass ich möglicherweise schwache Referenzen für Stub Maps mit Schwachen HashMap anstelle von HashMap einrichten muss, aber ich weiß nicht, ob das die richtige Wahl ist. Ich lese diese article durch und es ist immer noch nicht klar. Jede Hilfe wäre nützlich.

Danke,

Kartik

Antwort

1

Dereferenzierung Objekt sollte genügen. Der Java-Garbage Collector entfernt alle Objekte, auf die nicht zugegriffen werden kann, d. H. Es gibt keine Referenzen, die beim Zugriff darauf helfen. Wenn Sie Zweifel haben, dass Ihre Objekte wirklich verschwunden sind, können Sie einen der verfügbaren Java-Profiler verwenden.

Übrigens, kann ich Ihnen raten, eine der verfügbaren Implementierungen von Mock-Objekten zu verwenden, statt selbst Dinge wie SerbletRequestStub zu implementieren? Siehe zum Beispiel EasyMock. Und noch ein Ratschlag. Es gibt JUnit-Erweiterungen, die bereits alle webbezogenen Stubs implementieren. Siehe Apache Cactus.

0

Aufgrund der Unittest-Unabhängigkeit erstellt JUnit für jede Testmethode ein neues MyTest-Objekt.

Das heißt, testFoo() und testBar() werden in verschiedenen MyTest-Instanzen aufgerufen. Ihr Code ist genug Speicherproblem, auch tearDown() ist in diesem Fall nicht notwendig. Da die vorherige MyTest-Instanz für GC verfügbar ist, stehen ihre Mitglieder auch für GC zur Verfügung, sofern nichts anderes angegeben ist.

Verwandte Themen