gpt4 book ai didi

java - 单元测试 gwt-dispatch

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:57:19 25 4
gpt4 key购买 nike

我正在尝试使用 JUnit 为 gwt-dispatch 服务编写一些单元测试。使用调试器单步执行测试时出现以下错误:

Error in custom provider, com.google.inject.OutOfScopeException: Cannot access scoped object. Either we are not currently inside an HTTP Servlet request, or you may have forgotten to apply com.google.inject.servlet.GuiceFilter as a servlet filter for this request.

我将在这里稍微简化一下代码——希望我没有删除任何必要的东西。

import junit.framework.TestCase;
import net.customware.gwt.dispatch.client.standard.StandardDispatchService;

import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.servlet.ServletModule;
...

public class LoggedInServiceTest extends TestCase {

Injector i;
StandardDispatchService service;

protected com.google.inject.Injector getInjector() {
return Guice.createInjector(new ServletModule(),
new TestServletModule(),
new ActionsHandlerModule(),
new TestDispatchModule(),
new OpenIdGuiceModule());

}

public void setUp() throws Exception {
i = getInjector();
service = i.getInstance(StandardDispatchService.class);
}

public void testNotLoggedIn() {
try {
GetProjectsResult result = (GetProjectsResult) service.execute(new GetProjectsAction());
result.getSizeOfResult();
} catch (Exception e) {
fail();
}
}
}

服务请求确实应该通过 GuiceFilter,但看起来该过滤器并未设置。

关于注册过滤器需要进行哪些其他设置的任何想法?

最佳答案

问题就是它所说的。您正在尝试访问范围内的对象,但您当前不在范围内。最有可能的是,您的测试要求注入(inject)器提供一个 RequestScoped 对象或一个在注入(inject)依赖树中具有 RequestScoped 对象的对象,但测试没有做任何事情输入范围。

在测试中绑定(bind) GuiceFilter 没有帮助,因为您的测试不是试图通过 GuiceFilterHttpServletRequest 发送到服务小程序。

最好的选择是对代码进行单元测试。隔离地创建您的类,注入(inject)模拟。

假设您想进行某种集成测试,您有以下三种选择:

  1. 让您的测试安装一个名为 bindScope(RequestScoped.class, new FakeScope) 的测试模块。 FakeScope 类将实现 Scope 并具有进入和退出范围的方法。您可能必须使用您所依赖的对象的虚假实现来“播种”作用域。见指南 CustomScopes wiki page .这是集成测试的最佳选择,恕我直言
  2. 使用 ServletScopes.scopeRequest ( Javadoc ) 在模拟请求范围内运行部分测试代码。这变得有点丑陋,因为您需要传递一个 Callable
  3. 进行完整的端到端测试。启动您的服务器并使用 Selenium 向其发送请求。以这种方式很难获得良好的覆盖率,所以我会把它留给您真正需要浏览器来测试的事情。

如果您正在测试的类间接依赖于 HttpServletRequestHttpServletResponse,事情可能会变得有点困惑。这些类可能很难正确设置。大多数类不应直接或间接依赖于 servlet 类。如果不是这种情况,那么您要么做错了什么,要么需要找到一个好的操作框架,让您的大部分代码不依赖于这些类。

这是方法 1 的示例,使用来自 Guice CustomScopes wiki pageSimpleScope :

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)
}
}
}

关于java - 单元测试 gwt-dispatch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4680783/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com