2011-06-21 78 views
1

我已經開始玩Wicket,我選擇了Guice作爲依賴注入框架。現在我試圖學習如何爲WebPage對象編寫單元測試。檢票口和AtUnit

我google了一下,我發現this post,但它提到了AtUnit,所以我決定試一試。

我的網頁類看起來像這樣

public class MyWebPage extends WebPage 
{ 
    @Inject MyService service; 
    public MyWebPage() 
    { 
     //here I build my components and use injected object. 
     service.get(id); 
     ....  
    } 
} 

我創建了模擬,以取代它的任何生產MyServiceImpl,我猜那吉斯與AtUnit手應該把它注射。

現在的問題是:

  1. AtUnit預計,我標記目標對象與@unit - 那是因爲我可以通過已經創建的對象WicketTester

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

    但平時沒事我會用類名稱調用startPage。

  2. 我覺得AtUnit預計還有一個目標對象是市場@Inject這樣AtUnit可以創建和管理它 - 但我得到一個org.apache.wicket.WicketRuntimeException:沒有附加到當前線程的主要應用。我可以指示AtUnit使用wicketTester的應用程序嗎?

  3. 因爲我沒有在MyWebPage使用@Inject(我認爲)的所有對象,應該由吉斯注入是空的(在我的例子服務引用爲null)

我真的找不到Wicket環境內的任何關於AtUnit的內容。我做錯了什麼,我錯過了什麼嗎?

回答

0

我不知道AtUnit,但我用guice和TestNG使用wicket。我想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註釋的字段由吉斯填寫:分享此

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; 
    } 
} 
+0

好的,謝謝,仍然認爲AtUnit它不符合WicketTester使用最好庫。我想我會按照你的方式。 – kamiseq

+0

這不再適用於Wicket> 1.5。 – weltraumpirat