Калитка и 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 должен внедрить его.

Теперь проблемы:

  1. AtUnit ожидает, что я помечаю целевой объект с помощью @Unit - это нормально, так как я могу передать уже созданный объект в WicketTester

    @Unit MyWebPage page = new MyWebPage();
    wicketTester.startPage(page);
    

    но обычно я бы назвал startPage с именем класса.

  2. Я думаю, что AtUnit также ожидает, что целевой объект продается с @Inject, поэтому AtUnit может его создавать и управлять им, но я получаю исключение org.apache.wicket.WicketRuntimeException: к текущему потоку main не прикреплено приложение. Могу ли я поручить AtUnit использовать приложение от wicketTester?

  3. Поскольку я не использую @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;
  }
} 
Другие вопросы по тегам