是否可以使用GWT.create
而不是構造函數創建TextBox幷包裝現有的HTML元素? 我嘗試:GWT.create並封裝現有的html元素
TextBox text=GWT.create(TextBox.class)
text.setElement(DOM.createInput()) (2)
上述線(2)與失敗「不能設置元件兩次......」
我需要這個爲了使用GwtMockito和測試需要創建一個組件文本框。
謝謝!
是否可以使用GWT.create
而不是構造函數創建TextBox幷包裝現有的HTML元素? 我嘗試:GWT.create並封裝現有的html元素
TextBox text=GWT.create(TextBox.class)
text.setElement(DOM.createInput()) (2)
上述線(2)與失敗「不能設置元件兩次......」
我需要這個爲了使用GwtMockito和測試需要創建一個組件文本框。
謝謝!
看來你不得不求助於使用某種工廠:
public interface TextBoxFactory {
TextBox wrap(Element element);
}
這將讓注入到你的觀點,你會使用工廠來包裝現有元素在TextBox
。按照Baz的建議,默認的實現方式當然只是使用TextBox#wrap(Element)
。爲了測試目的,您將使用返回Mockito模擬的實現。
不是最漂亮的解決方案,但考慮到環境,我想不出一個「更清潔」的解決方案。
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);
}
}
並且可以訪問該方法。
有趣的方法,謝謝! –
事實上,有趣的解決方法。但是,我會擔心使用這個應用程序範圍。 'replaceElement'被封裝爲私有的原因。正如javadocs所說:「替換此對象的瀏覽器元素。**此方法僅用於支持Image中的特定用例,不應該由其他類**使用。」它現在可能會工作,但GWT團隊可能會在將來刪除它,或者以破壞應用程序的方式更改實現。 –
我同意你的觀點,這是一種骯髒的黑客攻擊,並且不可靠,但對於測試環境來說,它應該足夠好。 –
對gwtmockito不太瞭解。所以你不能使用構造函數? – Baz
你不能在這裏使用依賴注入嗎?我知道GIN在你要求的任何元素上調用GWT.create(),所以只需注入'Provider'並調用'provider.get()'? –
slugmandrew
@Baz gwtmockito只能模擬對GWT.create()的調用,它不知道模擬ctors – nlight