Testing wicket和AtUnit

Testing wicket和AtUnit,testing,wicket,wicket-tester,atunit,Testing,Wicket,Wicket Tester,Atunit,我已经开始使用Wicket,并选择它作为依赖注入框架。现在我试图学习如何为网页对象编写单元测试 我在谷歌上搜索了一下,发现它提到了单位,所以我决定试试 我的网页类看起来像这样 public class MyWebPage extends WebPage { @Inject MyService service; public MyWebPage() { //here I build my components and use injected object.

我已经开始使用Wicket,并选择它作为依赖注入框架。现在我试图学习如何为网页对象编写单元测试

我在谷歌上搜索了一下,发现它提到了单位,所以我决定试试

我的网页类看起来像这样

public class MyWebPage extends WebPage
{
    @Inject MyService service;
    public MyWebPage()
    {
        //here I build my components and use injected object.
        service.get(id);
        ....    
    }
}
我创建mock是为了用它替换任何生产myservicecimpl,我想手握AtUnit的Guice应该注入它

现在的问题是:

  • AtUnit希望我用@Unit标记目标对象——这没关系,因为我可以将已经创建的对象传递给WicketTester

    @Unit MyWebPage page = new MyWebPage();
    wicketTester.startPage(page);
    
    但通常我会用类名调用startPage

  • 我认为AtUnit也希望市场上有一个带有@Inject的目标对象,这样AtUnit就可以创建和管理它了——但我得到了一个org.apache.wicket.WicketRuntimeException:没有应用程序连接到当前的主线程。我可以指示AtUnit使用wicketTester的应用程序吗

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

  • 在Wicket环境中,我真的找不到任何关于AtUnit的信息。我是否做错了什么,是否遗漏了什么?

    我不知道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();
    

    好的,谢谢分享这个,仍然认为AtUnit不是WicketTester使用的最佳库。我想我会按照你的方式去做。
    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;
      }
    }