GWTTestCase: утверждения JUnit в обратном вызове вызывают исключение JavaScriptException - PullRequest
2 голосов
/ 11 марта 2012

Поэтому, если я вызываю любое утверждение 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, ведут себя нормально, поэтому кажется, что тест просто не знает, как обнаруживать сбои, когда они возникают из анонимных классов. Есть ли что-то, что я не правильно понимаю о том, как использовать утверждения JUnit в обратных вызовах / анонимных классах относительно GWTTestCase?

Ответы [ 2 ]

1 голос
/ 12 марта 2012

Ваше базовое понимание кажется верным - мандат delayTestFinish состоит в том, чтобы не допустить прохождения теста, если метод FinishTest () не вызывается в течение заданного количества миллисекунд (60 секунд в вашем случае).Нет необходимости вызывать finishTest() в любом из методов обратного вызова, так как fail сгенерирует исключение (если код даже зайдет так далеко).

Вы уверены, что тест успешно завершен?Как написано, если что-то неправильно настроено, и вызов никогда не передается на сервер, или сервер никогда не возвращается, ни fail, ни finishTest не могут быть вызваны, поэтому тестовый метод не может пройти.Обязательно дождитесь полных 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 голосов
/ 20 апреля 2012

Проблема заключалась в том, что я вызывал finishTest () в моем gwtSetUp (). Я выполнял там некоторый код инициализации, который являлся асинхронным методом, и хотел убедиться, что он завершился до фактического кода теста, но оказалось, что он просто заканчивал тест до того, как что-либо было фактически проверено. Мораль истории: не будь глупым по поводу своего места в finTest ().

...