1

我已经开始使用 Wicket 并且选择了Guice作为依赖注入框架。现在我正在尝试学习如何为 WebPage 对象编写单元测试。

我用谷歌搜索了一下,找到了这篇文章,但它提到了 AtUnit,所以我决定试一试。

我的网页类看起来像这样

public class MyWebPage extends WebPage
{
    @Inject MyService service;
    public MyWebPage()
    {
        //here I build my components and use injected object.
        service.get(id);
        ....    
    }
}

我创建了 mock 以用它替换任何生产 MyServiceImpl ,我猜与 AtUnit 一起使用的 Guice 应该注入它。

现在的问题是:

  1. AtUnit 期望我用 @Unit 标记目标对象 - 没关系,因为我可以将已经创建的对象传递给 WicketTester

    @Unit MyWebPage page = new MyWebPage();
    wicketTester.startPage(page);
    

    但通常我会用类名调用 startPage 。

  2. 我认为 AtUnit 也期望目标对象是带有 @Inject 的市场,因此 AtUnit 可以创建和管理它 - 但我得到一个org.apache.wicket.WicketRuntimeException: There is no application attach to current thread main。我可以指示 AtUnit 使用来自 wicketTester 的应用程序吗?

  3. 因为我不在 MyWebPage 上使用 @Inject(我认为)所有应该由 Guice 注入的对象都是空的(在我的示例中,服务引用是空的)

我真的在 Wicket 环境中找不到任何关于 AtUnit 的信息。我做错了什么,我错过了什么吗?

4

1 回答 1

0

我不知道 AtUnit,但我使用带有 guice 和 TestNG 的检票口。我想 AtUnit 应该以同样的方式工作。重要的一点是使用 guice 创建 Web 应用程序。

在这里,我如何将所有这些东西绑定在一起进行测试。

我的所有测试都有一个抽象基类:

public abstract class TesterWicket<T extends Component> {

 @BeforeClass
    public void buildMockedTester() {
        System.out.println("TesterWww.buildMockedTester");
        injector = Guice.createInjector(buildModules());
        CoachWebApplicationFactory instance = 
            injector.getInstance(CoachWebApplicationFactory.class);
        WebApplication application = instance.buildWebApplication();
        tester = new WicketTester(application);
    }

protected abstract List<Module> buildModules();

对每个测试类都进行了初始化。子类在 buildModules 方法中定义了测试所需的模块。

在我的 IWebApplicationFactory 中,我添加了GuiceComponentInjector. 这样,在所有组件实例化之后,使用 @Inject 注释的字段由 Guice 填充:

public class CoachWebApplicationFactory implements IWebApplicationFactory {

  private static Logger LOG = LoggerFactory.getLogger(CoachWebApplicationFactory.class);

  private final Injector injector;

  @Inject
  public CoachWebApplicationFactory(Injector injector) {
      this.injector = injector;
  }

  public WebApplication createApplication(WicketFilter filter) {
    WebApplication app = injector.getInstance(WebApplication.class);
    Application.set(app);
    app.addComponentInstantiationListener(new GuiceComponentInjector(app, injector));
    return app;
  }
} 
于 2011-06-23T17:25:54.347 回答