我开始使用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/