0

我写了一个这样的 GWTTestCase:

public void testClickButton() {
    SampleView view = new SampleView();
    RootPanel.get().add(view);
    view.textBox.setText("Saeed Zarinfam");

    assertEquals("", view.label.getText());

//        ButtonElement.as(view.button.getElement()).click();
    view.button.getElement().<ButtonElement>cast().click();

    assertEquals("Bean \"OCTO\" has been created", view.label.getText());
}

当我运行这个测试时,它连接到我的 servlet(我在我的 servlet 上添加了一些日志),但是 RPC 回调没有在我SampleView的 junit 中调用:

expected: <Bean "OCTO" has been created>, actual: <>

这是我在按钮单击处理程序中的回调:

@UiHandler("button")
void onClick(ClickEvent e) {

    labelTest.setText("click button");

    AsyncCallback<FooBean> callback = new AsyncCallback<FooBean>() {
        public void onFailure(Throwable caught) {
            // Show the RPC error message to the user
            labelTest.setText("call fail");
            label.setText("Failure : " + caught.getMessage());
        }

        public void onSuccess(FooBean result) {
            labelTest.setText("call success");
            label.setText("Bean \"" + result.getName() + "\" has been created");
        }
    };

    // Make the call. Control flow will continue immediately and later
    // 'callback' will be invoked when the RPC completes.
    service.createBean("OCTO", callback);


}

为什么在这种情况下不调用 GWT rpc 回调?

4

1 回答 1

1

RPC 调用即使在GWTTestCase. 你必须打电话delayTestFinish()告诉运行程序测试是异步的,并调用finish()“在未来的某个时间”告诉它它已经完成并且可以(否则你会超时)。

在您的情况下,由于调用代码无法知道 RPC 调用何时完成,您只能大胆猜测它需要多少时间,然后使用Timer.
如果您问我,请更好地重构您的代码以使其更具可测试性(注意:Selenium 的工作原理大致相同:每秒检查一次条件,直到超时,http://seleniumhq.org/docs/02_selenium_ide.jsp#the-waitfor -commands-in-ajax-applications,就像Timer如果不满足条件,您最多可以重新安排 N 次)

请参阅https://developers.google.com/web-toolkit/doc/latest/DevGuideTesting#DevGuideAsynchronousTesting

于 2013-01-07T11:13:58.143 回答