2

因此,如果我调用任何从回调方法内部失败的 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 断言,我有什么不正确的理解吗?

4

2 回答 2

1

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

你确定测试成功完成了吗?如所写,如果某些配置错误并且调用永远不会到达服务器,或者服务器永远不会返回,则既不failfinishTest不能调用,因此测试方法无法通过。确保在接受结果为“通过”之前等待整整 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());
  }
});
于 2012-03-12T05:10:32.550 回答
0

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

于 2012-04-20T02:05:07.537 回答