Gwt junit 测试没有初始化 $wnd.jQuery

Gwt junit test does not initialize $wnd.jQuery

inputmask 与 gwt 的结合方式如下:


public class JQueryMask {

    public native static void setMask(Element elem,String mask) /*-{

        $wnd.jQuery(elem).find("input").inputmask(mask);
        $wnd.jQuery(elem).find("input").change(function(e) {

            });
    }-*/;

    public native static void removeMask(Element elem) /*-{
        $wnd.jQuery(elem).find("input").inputmask("remove");

    }-*/;


    public native static void setMaskWithGreadyFalse(Element elem,String mask) /*-{

    $wnd.jQuery(elem).find("input").inputmask({mask:mask,greedy:false});
    $wnd.jQuery(elem).find("input").change(function(e) {

            });

    }-*/;

}



当小部件初始化并且浏览器中一切正常时调用此方法。 jQuery 变量未初始化,这会产生相同的异常:


console.log($wnd.jQuery());

还有:

console.log($wnd.$());

即:


com.google.gwt.core.client.JavaScriptException: (null) @assembly.gwtlib.gui.plugins.JQueryMask::removeMask(Lcom/google/gwt/dom/client/Element;)([JavaScript object(77)]): null
    at com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:249)
    at com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:136)
    at com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:576)
    at com.google.gwt.dev.shell.ModuleSpace.invokeNativeVoid(ModuleSpace.java:304)
    at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeVoid(JavaScriptHost.java:107)
    at assembly.gwtlib.gui.plugins.JQueryMask.removeMask(JQueryMask.java)
    at assembly.gwtlib.gui.widget.input.Input.setMask(Input.java:54)
    at assembly.gwtlib.gui.widget.input.DateInput.(DateInput.java:76)
    ...

GWTTestCases 使用它们自己的 HTML 主页(因为,从技术上讲,您可能甚至没有一个,或者不是静态的),所以如果您需要 jQuery 进行测试,您必须从测试本身加载它(例如使用 ScriptInjector,从您的测试方法或从 gwtSetUp()

感谢 Thomas Broyer 我已经实现了以下代码:

 Callback c=new Callback() {

@Override public void onSuccess(Void result) { ScriptInjector.fromUrl("urlTo/jquery.inputmask.js").setWindow(ScriptInjector.TOP_WINDOW).setCallback(new Callback<Void, Exception>() { @Override public void onSuccess(Void result) { //Your tests } @Override public void onFailure(Exception reason) { reason.printStackTrace(); junit.framework.Assert.fail(reason.getMessage()); } }).inject(); } @Override public void onFailure(Exception reason) { reason.printStackTrace(); junit.framework.Assert.fail(reason.getMessage()); } }; ScriptInjector.fromUrl("urlTo/jQuery-2.1.4.min.js").setWindow(ScriptInjector.TOP_WINDOW).setCallback(c).inject();//setWindow(ScriptInjector.TOP_WINDOW) is important