2016-06-03 6 views
0

Das Problem, das ich habe, ist, dass ich den Servlet-Kontext wie im folgenden Code autuwired, indem Sie es im Konstruktor übergeben. Leider kann es beim Ausführen eines Tests nichts autowire, da es keine ServlextContext und Spring fehlschlägt.Kann Java ServlextContext in Tests für Tomcat-Projekt nicht verbinden

@Autowired 
public MyClass(ServletContext context) { 
    this.servletContext = context; 
} 

Ich brauche nicht wirklich die ServletContext für Tests autowired, nur wenn der Tomcat Krieg geführt wird, wo ich dann Methoden rufen die ServletContext

Ich bin ein Tomcat Server das Projekt ausgeführt wird, verwendet Frühling .

+0

Sie sollten keinen App-Server benötigen, um einen Komponententest auszuführen. Sie müssen genauer darüber nachdenken, wie Sie diese App richtig testen können. – duffymo

+0

Ja, ich brauche den Server nicht, um die Tests auszuführen. Einige Tests und der Server teilen jedoch dieselben Spring-Konfigurationsdateien und eine der Dateien erfordert einen Servlet-Kontext. –

+0

Spring sollte nicht Teil Ihrer Tests sein. Dafür sind Mocks da. Erstellen Sie sie in Ihrem JUnit-Test und injizieren Sie sie manuell. Dadurch werden Ihre Komponententests auf die Klasse ausgerichtet, die Sie testen möchten. Sie werden auch schneller laufen. – duffymo

Antwort

0

Da ich Spring benutze, habe ich dies behoben, indem ich ServletContextAware implementiert und diese Methode hinzugefügt habe. Die Methode wird niemals aufgerufen, wenn kein Kontext vorhanden ist. Daher bleibt servletContext null, wenn keine verfügbar ist.

public void setServletContext(ServletContext servletContext) { this.servletContext = servletContext; }

Dann prüfe ich if(servletContext==null) kurz vor die Teile des Codes ausgeführt wird, der das Servlet Kontext tatsächlich benötigen.

+0

keine Notwendigkeit zu überprüfen 'if (ServletContext == null)' – Priyamal

+0

Ich überprüfe, ob es Null vor dem Ausführen von Code, der ServletContext benötigt, wie es 'NullPointerException's –

+0

immer noch keine Überprüfung benötigen – Priyamal

0
@Autowired 
    ServletContext context; 

i denkt, dass die beste Praxis mit obigen Ansatz zu gehen, weil in der Regel, seine die Modellklasse wir methods.and passieren Sie die ServletContext aus einem Methodenparameter erhalten kann dies nicht funktionieren wird.

public void setServletContext(ServletContext servletContext) { 
     this.servletContext = servletContext; 
} 

und Sie können ServletContextAware Schnittstelle zu Ihrem controller Klasse implementieren und dann können Sie setServletContext Methode überschreiben, um dies zu erreichen.

private ServletContext context; 

@Override 
public void setServletContext(ServletContext servletContext) { 
    this.servletContext = servletContext; 
}