2012-03-11 50 views
2

所以,如果我把所有的JUnit断言,从一个回调方法里面失败我得到这个异常:GWTTestCase:回调中JUnit断言提高JavaScriptException

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断言?

回答

0

问题是我在我的gwtSetUp()中调用finishTest()。我在那里运行一些初始化代码,这是一种异步方法,并且希望确保它在实际测试代码之前完成,但事实证明它只是在实际测试之前完成测试。故事的道德:不要对你的finishTest()放置感到无聊。

1

您的基本理解似乎是正确的 - delayTestFinish的任务是不允许测试通过,除非finishTest()在给定的毫秒数(在您的情况下为60秒)内被调用。不需要在任何回调方法中调用finishTest(),因为fail会抛出一个异常(如果代码甚至有这么多)。

您确定测试成功完成吗?正如所写的,如果某些东西配置错误,并且调用永远不会传递到服务器,或者服务器永远不会返回,则不能调用failfinishTest,因此测试方法无法通过。确保您等待整整60秒,然后接受结果为'已通过' - 如果从未调用finishTest,则测试方法不会被认为是完整的,或者应该被视为失败。

这就是说,例外是看有用的 - 这是从仿真浏览器中 - 的HtmlUnit - 这异常是在“浏览器”会错。从短的痕迹,没有其他的日志声明,很难说什么是错的。您也可以考虑在真正的浏览器中运行此功能,以查看是否出现了更多有用的错误 - 请查看http://code.google.com/webtoolkit/doc/latest/DevGuideTestingRemoteTesting.html了解如何使用常规浏览器以dev或prod模式运行测试。

另外一个想法可能是在GWT中注册一个未捕获的异常处理程序,以了解它的具体含义 - 其他一些异常可能会终止测试,并以某种方式阻止delayTestFinish的运行正确(虽然我从来没有听说过这样的事情)。

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

使用:
public void onSuccess(SearchResult sr){ System.out.println(“here”); fail(); } 测试RPC确实通过,因为它打印“这里”,并且Junit仍然没有检测到任何故障,尽管它应该。如果有帮助,我已经更新了带有完整堆栈跟踪的问题... – 2012-03-12 15:29:56