Zakładając, że klasa jest coś takiego:
class ClassToTest {
public void doSomething() {
String sessionId = RequestContextHolder.currentRequestAttributes().getSessionId();
// Do something with sessionId
}
}
Jeśli nie mają zdolność do zmiany klasy, która używa RequestContextHolder
, to można zastąpić klasę RequestContextHolder
w kodzie testowym. tj. Tworzysz klasę o tej samej nazwie, w tym samym pakiecie i upewniasz się, że jest ona załadowana przed właściwą klasą Spring.
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";
}
// Stub out the other methods.
}
}
Teraz, gdy testy zakończą, będą one podnieść swoją klasę RequestContextHolder
i używać zamiast do wiosny jednego (zakładając, że ścieżka klasy jest skonfigurowany tak się stało). To nie jest dobry sposób na uruchomienie testów, ale może być konieczne, jeśli nie możesz zmienić testowanej klasy.
Można również ukryć pobieranie identyfikatora sesji za abstrakcją. Na przykład wprowadzenie interfejs:
public interface SessionIdAccessor {
public String getSessionId();
}
Utwórz realizacji:
public class RequestContextHolderSessionIdAccessor implements SessionIdAccessor {
public String getSessionId() {
return RequestContextHolder.currentRequestAttributes().getSessionId();
}
}
i skorzystać z abstrakcji w swojej klasie:
class ClassToTest {
SessionIdAccessor sessionIdAccessor;
public ClassToTest(SessionIdAccessor sessionIdAccessor) {
this.sessionIdAccessor = sessionIdAccessor;
}
public void doSomething() {
String sessionId = sessionIdAccessor.getSessionId();
// Do something with sessionId
}
}
Następnie można zapewnić obojętne wdrożenia dla swoich badań:
public class DummySessionIdAccessor implements SessionIdAccessor {
public String getSessionId() {
return "dummy session id";
}
}
Tego typu rzeczy podkreślają najlepszą praktykę, aby ukryć pewne szczegóły środowiskowe za abstrakcjami, aby można je było wymienić, jeśli zmieni się twoje środowisko. Odnosi się to również do tego, że twoje testy są mniej kruche, zamieniając fałszywe implementacje na "prawdziwe".
Dziękuję @ nicholas.hauschild. Idealne i czyste rozwiązanie! – satoshi
@nicholas, dzięki za szybkie rozwiązanie, zadziałało dla mnie, dzięki jeszcze raz – Bravo