繁体   English   中英

GWTTestCase:回调中的JUnit断言引发JavaScriptException

[英]GWTTestCase: JUnit Assertions within callback raises JavaScriptException

因此,如果我从回调方法内部调用任何失败的JUnit断言,则会收到此异常:

Mar 12, 2012 11:24:41 AM 

com.gargoylesoftware.htmlunit.javascript.background.JavaScriptJobManagerImpl runJob
SEVERE: Job run failed with unexpected RuntimeException: [object Class JavaObject] (injected script#14)
net.sourceforge.htmlunit.corejs.javascript.JavaScriptException: [object Class JavaObject] (injected script#14)
    at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpretLoop(Interpreter.java:1062)
    at script(injected script:14)
    at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpret(Interpreter.java:845)
    at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.call(InterpretedFunction.java:164)
    at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.doTopCall(ContextFactory.java:429)
    at com.gargoylesoftware.htmlunit.javascript.HtmlUnitContextFactory.doTopCall(HtmlUnitContextFactory.java:269)
    at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3162)
    at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.call(InterpretedFunction.java:162)
    at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.callFunction(JavaScriptEngine.java:559)
    at com.gargoylesoftware.htmlunit.javascript.host.xml.XMLHttpRequest.setState(XMLHttpRequest.java:181)
    at com.gargoylesoftware.htmlunit.javascript.host.xml.XMLHttpRequest.doSend(XMLHttpRequest.java:525)
    at com.gargoylesoftware.htmlunit.javascript.host.xml.XMLHttpRequest.access$000(XMLHttpRequest.java:64)
    at com.gargoylesoftware.htmlunit.javascript.host.xml.XMLHttpRequest$1.run(XMLHttpRequest.java:461)
    at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:537)
    at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:538)
    at com.gargoylesoftware.htmlunit.javascript.host.xml.XMLHttpRequest$2.run(XMLHttpRequest.java:467)
    at com.gargoylesoftware.htmlunit.javascript.background.JavaScriptJobManagerImpl.runJob(JavaScriptJobManagerImpl.java:226)
    at com.gargoylesoftware.htmlunit.javascript.background.JavaScriptJobManagerImpl.runSingleJob(JavaScriptJobManagerImpl.java:307)
    at com.gargoylesoftware.htmlunit.javascript.background.JavaScriptExecutor.run(JavaScriptExecutor.java:182)
    at java.lang.Thread.run(Thread.java:722)

一个简单的测试产生以下结果:

public void testSimple() {
    MyPrgrmServiceAsync serv = GWT.create(MyPrgrmService.class);
    serv.search("some query", new AsyncCallback<SearchResult>() {
        public void onSuccess(SearchResult sr) {
            fail();
        }

        public void onFailure(Throwable caught) {
            fail(caught.toString());
        }
    });

    delayTestFinish(60000);
}

运行此测试时,只要JUnit Runner与Eclipse中显示的绿色条有关,它就会“通过”,但是显然它应该失败。 唯一出错的指示是控制台中的异常。 如果我将fail()移到回调之外,则它通常会失败并指示失败。 另外,解析为true的断言行为正常,因此似乎测试根本不知道如何检测来自匿名类的故障。 关于GWTTestCase,如何在回调/匿名类中使用JUnit断言,我是否理解不正确?

您的基本理解似乎是正确的delayTestFinish的任务是不允许测试通过,除非在给定的毫秒数(在您的情况下为60秒)内调用finishTest()。 无需在任何一个回调方法中调用finishTest() ,因为fail会引发异常(如果代码甚至达到了极限)。

您确定测试成功完成了吗? 如所写,如果配置错误,并且调用永远不会传递到服务器,或者服务器永远不会返回,则既不会调用fail也不能调用finishTest ,因此测试方法无法通过。 确保等待完整的60秒钟,然后再接受“通过”结果-如果从不调用finishTest ,则测试方法将不被视为完整方法,否则应被视为失败。

也就是说,查看异常非常有用-这是从仿真浏览器内部-htmlunit发出的,并且此异常是“浏览器”中的错误。 从简短的跟踪,没有其他日志语句,很难说出到底是哪里出了问题。 您也可以考虑在实际的浏览器中运行此命令,以查看是否出现其他有用的错误-请访问http://code.google.com/webtoolkit/doc/latest/DevGuideTestingRemoteTesting.html ,了解如何从常规浏览器,处于开发或生产模式。

另一个想法可能是在GWT中注册一个未捕获的异常处理程序,以查看发生了什么-可能有其他异常终止了测试,并以某种方式执行该测试,以防止delayTestFinish正常运行(尽管我(从未听说过这样的事情)。

GWT.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
  public void onUncaughtException(Throwable e) {
    fail(e.getMessage());
  }
});

问题是我在gwtSetUp()中调用了finishTest()。 我在那里运行一些初始化代码,这是一个异步方法,想确保它在实际测试代码之前完成,但是事实证明,它只是在实际测试任何东西之前就完成了测试。 故事的寓意:不要对您的finishTest()位置感到愚蠢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM