2015-04-30 25 views
2

是否可以使用GWT.create而不是構造函數創建TextBox幷包裝現有的HTML元素? 我嘗試:GWT.create並封裝現有的html元素

TextBox text=GWT.create(TextBox.class) 
text.setElement(DOM.createInput()) (2) 

上述線(2)與失敗「不能設置元件兩次......」

我需要這個爲了使用GwtMockito和測試需要創建一個組件文本框。

謝謝!

+0

對gwtmockito不太瞭解。所以你不能使用構造函數? – Baz

+0

你不能在這裏使用依賴注入嗎?我知道GIN在你要求的任何元素上調用GWT.create(),所以只需注入'Provider '並調用'provider.get()'? – slugmandrew

+0

@Baz gwtmockito只能模擬對GWT.create()的調用,它不知道模擬ctors – nlight

回答

2

看來你不得不求助於使用某種工廠:

public interface TextBoxFactory { 
    TextBox wrap(Element element); 
} 

這將讓注入到你的觀點,你會使用工廠來包裝現有元素在TextBox。按照Baz的建議,默認的實現方式當然只是使用TextBox#wrap(Element)。爲了測試目的,您將使用返回Mockito模擬的實現。

不是最漂亮的解決方案,但考慮到環境,我想不出一個「更清潔」的解決方案。

3

UIObject有一個包保護replaceElement方法,它會做你喜歡做的事情。

在合適的包像這樣建立一個包裝:

package com.google.gwt.user.client.ui; 

import com.google.gwt.dom.client.Element; 

public class ElementReplace 
{ 
    public static void replaceElement(UIObject obj, Element elem) 
    { 
     obj.replaceElement(elem); 
    } 
} 

並且可以訪問該方法。

+0

有趣的方法,謝謝! –

+0

事實上,有趣的解決方法。但是,我會擔心使用這個應用程序範圍。 'replaceElement'被封裝爲私有的原因。正如javadocs所說:「替換此對象的瀏覽器元素。**此方法僅用於支持Image中的特定用例,不應該由其他類**使用。」它現在可能會工作,但GWT團隊可能會在將來刪除它,或者以破壞應用程序的方式更改實現。 –

+0

我同意你的觀點,這是一種骯髒的黑客攻擊,並且不可靠,但對於測試環境來說,它應該足夠好。 –