Предполагая, что ваш класс что-то вроде:
class ClassToTest {
public void doSomething() {
String sessionId = RequestContextHolder.currentRequestAttributes().getSessionId();
// Do something with sessionId
}
}
Если у вас нет возможности изменить класс, который использует RequestContextHolder
, тогда вы можете переопределить класс RequestContextHolder
в своем тестовом коде.
То есть вы создаете класс с тем же именем в том же пакете и гарантируете, что он загружен до фактического класса 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.
}
}
Теперь, когда ваши тесты будут запущены, они подберут ваш класс RequestContextHolder
и будут использовать его по сравнению с классом Spring (при условии, что для этого настроен classpath).
Это не очень хороший способ запустить ваши тесты, но он может быть необходим, если вы не можете изменить класс, который вы тестируете.
Кроме того, вы можете скрыть получение идентификатора сеанса за абстракцией. Например, введите интерфейс:
public interface SessionIdAccessor {
public String getSessionId();
}
Создать реализацию:
public class RequestContextHolderSessionIdAccessor implements SessionIdAccessor {
public String getSessionId() {
return RequestContextHolder.currentRequestAttributes().getSessionId();
}
}
И используйте абстракцию в своем классе:
class ClassToTest {
SessionIdAccessor sessionIdAccessor;
public ClassToTest(SessionIdAccessor sessionIdAccessor) {
this.sessionIdAccessor = sessionIdAccessor;
}
public void doSomething() {
String sessionId = sessionIdAccessor.getSessionId();
// Do something with sessionId
}
}
Затем вы можете предоставить фиктивную реализацию для ваших тестов:
public class DummySessionIdAccessor implements SessionIdAccessor {
public String getSessionId() {
return "dummy session id";
}
}
Подобные вещи выдвигают на первый план обычную лучшую практику, позволяющую скрывать некоторые детали среды за абстракциями, чтобы вы могли поменять их, если ваша среда изменится.
Это в равной степени относится и к тому, чтобы сделать ваши тесты менее хрупкими путем замены фиктивных реализаций на «настоящие».