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

我在Google上搜索了一下,发现了this post,但是它提到了AtUnit,所以我决定尝试一下。

我的WebPage类看起来像这样

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


我创建了模拟来用它替换任何生产MyServiceImpl,我想与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();


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

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

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

关于testing - wicket 和AtUnit,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6432422/

10-10 16:29