1

私は 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);
        ....    
    }
}

プロダクションの MyServiceImpl をそれに置き換えるモックを作成しましたが、Guice と AtUnit がそれを注入する必要があると思います。

問題は次のとおりです。

  1. AtUnit は、ターゲット オブジェクトを @Unit でマークすることを期待しています。これは、作成済みのオブジェクトを WicketTester に渡すことができるため、問題ありません。

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

    しかし、通常はクラス名で startPage を呼び出します。

  2. AtUnit は、ターゲット オブジェクトが @Inject を使用して市場に出されていることも期待しているため、AtUnit はそれを作成および管理できますが、org.apache.wicket.WicketRuntimeException: There is no application attached to current thread main が発生します。AtUnit に wicketTester からのアプリケーションを使用するように指示できますか?

  3. 私は MyWebPage で @Inject を使用していないため (私が思うに)、Guice によって注入されるべきすべてのオブジェクトは null です (私の例では、サービス参照は null です)。

Wicket 環境内の AtUnit については本当に何も見つかりません。私は何か間違ったことをしていますか、何かが欠けていますか?

4

1 に答える 1

0

AtUnitはわかりませんが、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ます。このように、すべてのコンポーネントのインスタンス化の後、@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;
  }
} 
于 2011-06-23T17:25:54.347 に答える