Проблема только в том, что говорится.Вы пытаетесь получить доступ к объекту в области, но в данный момент вы не находитесь в области видимости.Скорее всего, ваш тест запрашивает у инжектора объект RequestScoped
или объект, у которого есть RequestScoped
объект в дереве зависимостей внедрения, но тест ничего не сделал для входа в область действия.
Привязка GuiceFilter
в тесте не помогает, потому что ваш тест не пытается отправить сервлету HttpServletRequest
через GuiceFilter
.
Лучшим вариантом будет модульное тестирование вашего кода.,Создавайте свои классы изолированно, внедряя макеты.
Предполагая, что вы хотите провести какой-то интеграционный тест, у вас есть три варианта:
- Пусть ваш тест установит тестовый модуль, который называется
bindScope(RequestScoped.class, new FakeScope)
.Класс FakeScope
будет реализовывать Scope
и иметь методы для входа и выхода из области.Возможно, вам придется «заполнить» область видимости поддельными реализациями объектов, от которых вы зависите.См. Вики-страницу Guice CustomScopes .Это лучший вариант для интеграционных тестов, IMHO - Использование
ServletScopes.scopeRequest
( Javadoc ) для запуска части тестового кода внутри области имитированного запроса.Это немного уродливо, так как вам нужно пройти Callable
. - Провести полный сквозной тест.Запустите свой сервер и отправьте ему запросы, используя Selenium.Очень сложно получить хорошее освещение таким образом, поэтому я бы оставил это для вещей, которые вам действительно нужен браузер для тестирования.
Все может стать немного запутанным, если класс, который вы тестируете, косвенно зависит отHttpServletRequest
или HttpServletResponse
.Эти классы могут быть сложными для правильной настройки.Большинство ваших классов не должны зависеть от классов сервлетов прямо или косвенно.Если это не так, вы либо делаете что-то не так, либо вам нужно найти хорошую платформу действий, которая позволит вам большей частью кода не зависеть от этих классов.
Вот пример подхода 1, использующегоSimpleScope
из Guice Вики-страница CustomScopes :
public class LoggedInServiceTest extends TestCase {
private final Provider<StandardDispatchService> serviceProvider;
private final SimpleScope fakeRequestScope = new SimpleScope();
private final HttpServletRequest request = new FakeHttpServletRequest();
protected Injector createInjector() {
return Guice.createInjector(new FakeRequestScopeModule(),
new LoggedInServiceModule();
}
@Override
protected void setUp() throws Exception {
super.setUp();
Injector injector = createInjector();
scope.enter();
serviceProvider = injector.getProvider(StandardDispatchService.class);
}
@Override
protected void tearDown() throws Exception {
fakeRequestScope.exit()
super.tearDown();
}
public void testNotLoggedIn() {
fakeRequestScope.enter();
// fill in values of request
fakeRequestScope.seed(FakeHttpServletRequest.class, request);
StandardDispatchService service = serviceProvider.get();
GetProjectsAction action = new GetProjectsAction();
try {
service.execute(action);
fail();
} catch (NotLoggedInException expected) {
}
}
private class FakeRequestScopeModule extends AbstractModule() {
@Override
protected void configure() {
bind(RequestScoped.class, fakeRequestScope);
bind(HttpServletRequest.class)
.to(FakeHttpServletRequest.class)
.in(RequestScoped.class)
}
}
}