2012-03-11 126 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