【问题标题】:wicket and AtUnit检票口和 AtUnit
【发布时间】:2011-06-21 21:50:36
【问题描述】:

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

我用谷歌搜索了一下,我找到了this post,但它提到了 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,我猜 Guice 与 AtUnit 应该注入它。

现在的问题是:

  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当前线程主线程。我可以指示 AtUnit 使用来自 wicketTester 的应用程序吗?

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

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

【问题讨论】:

    标签: testing wicket wicket-tester atunit


    【解决方案1】:

    我不知道 AtUnit,但我使用 wicket 和 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;
      }
    } 
    

    【讨论】:

    • 好的,感谢分享,仍然认为 AtUnit 不是与 WicketTester 一起使用的最佳库。我想我会按照你的方式行事。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多