калитка и AtUnit - PullRequest
       19

калитка и AtUnit

1 голос
/ 22 июня 2011

Я начал играть с 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, являются нулевыми (в моем примере ссылка на службуимеет значение null)

Я действительно не могу найти ничего об AtUnit в среде Wicket.Я что-то делаю не так, я что-то упускаю?

1 Ответ

0 голосов
/ 23 июня 2011

Я не знаю AtUnit, но я использую калитку с подсказкой и TestNG.Я полагаю, что AtUnit должен работать так же.Важным моментом является создание веб-приложения с использованием guice.

Вот как я связываю все эти вещи вместе для своих тестов.

У меня есть абстрактный базовый класс для всех моих тестов:

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