Калитка и AtUnit
Я начал играть с Wicket и выбрал Guice в качестве среды внедрения зависимостей. Сейчас я пытаюсь научиться писать модульный тест для объекта WebPage.
Я немного погуглил и нашел этот пост, но в нем упоминалось AtUnit, поэтому я решил попробовать.
Мой класс WebPage выглядит так
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 должен внедрить его.
Теперь проблемы:
AtUnit ожидает, что я помечаю целевой объект с помощью @Unit - это нормально, так как я могу передать уже созданный объект в WicketTester
@Unit MyWebPage page = new MyWebPage(); wicketTester.startPage(page);
но обычно я бы назвал startPage с именем класса.
Я думаю, что AtUnit также ожидает, что целевой объект продается с @Inject, поэтому AtUnit может его создавать и управлять им, но я получаю исключение org.apache.wicket.WicketRuntimeException: к текущему потоку main не прикреплено приложение. Могу ли я поручить AtUnit использовать приложение от wicketTester?
- Поскольку я не использую @Inject в MyWebPage (я думаю), все объекты, которые должны быть введены Guice, являются нулевыми (в моем примере ссылка на службу является нулевой)
Я действительно не могу найти ничего об AtUnit в среде Wicket. Я что-то делаю не так, я что-то упускаю?
1 ответ
Я не знаю AtUnit, но я использую калитку с хитростью и TestNG. Я полагаю, что AtUnit должен работать так же. Важным моментом является создание веб-приложения с использованием подсказок.
Вот как я связываю все эти вещи вместе для моих тестов.
У меня есть абстрактный базовый класс для всех моих тестов:
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;
}
}