Angenommen, Ihre Klasse ist so etwas wie:
class ClassToTest {
public void doSomething() {
String sessionId = RequestContextHolder.currentRequestAttributes().getSessionId();
}
}
Wenn Sie nicht in der Lage sind, die verwendete Klasse zu ändern RequestContextHolder
, können Sie die RequestContextHolder
Klasse in Ihrem Testcode überschreiben . Das heißt, Sie erstellen eine Klasse mit demselben Namen im selben Paket und stellen sicher, dass sie vor der eigentlichen Spring-Klasse geladen wird.
package org.springframework.web.context.request;
public class RequestContextHolder {
static RequestAttributes currentRequestAttributes() {
return new MyRequestAttributes();
}
static class MyRequestAttributes implements RequestAttributes {
public String getSessionId() {
return "stub session id";
}
}
}
Wenn Ihre Tests ausgeführt werden, nehmen sie Ihre RequestContextHolder
Klasse auf und verwenden diese vor der Spring-Klasse (vorausgesetzt, der Klassenpfad ist dafür eingerichtet). Dies ist keine besonders gute Möglichkeit, Ihre Tests zum Laufen zu bringen, aber es kann erforderlich sein, wenn Sie die zu testende Klasse nicht ändern können.
Alternativ können Sie das Abrufen der Sitzungs-ID hinter einer Abstraktion verbergen. Stellen Sie zum Beispiel eine Schnittstelle vor:
public interface SessionIdAccessor {
public String getSessionId();
}
Erstellen Sie eine Implementierung:
public class RequestContextHolderSessionIdAccessor implements SessionIdAccessor {
public String getSessionId() {
return RequestContextHolder.currentRequestAttributes().getSessionId();
}
}
Und verwenden Sie die Abstraktion in Ihrer Klasse:
class ClassToTest {
SessionIdAccessor sessionIdAccessor;
public ClassToTest(SessionIdAccessor sessionIdAccessor) {
this.sessionIdAccessor = sessionIdAccessor;
}
public void doSomething() {
String sessionId = sessionIdAccessor.getSessionId();
}
}
Dann können Sie eine Dummy-Implementierung für Ihre Tests bereitstellen:
public class DummySessionIdAccessor implements SessionIdAccessor {
public String getSessionId() {
return "dummy session id";
}
}
Diese Art von Dingen hebt eine übliche Best Practice hervor, um bestimmte Umgebungsdetails hinter Abstraktionen zu verbergen, damit Sie sie austauschen können, wenn sich Ihre Umgebung ändert. Dies gilt auch, um Ihre Tests weniger spröde zu machen, indem Sie Dummy-Implementierungen gegen "echte" austauschen.