GWT SyncProxy 测试

Posted

技术标签:

【中文标题】GWT SyncProxy 测试【英文标题】:GWT SyncProxy Testing 【发布时间】:2012-09-26 18:36:52 【问题描述】:

我使用标准 GWT 示例创建了一个新的 Web 应用程序项目。然后我想用下面的测试类测试greetingserviceimpl。我不知道问题出在哪里。我也上传项目:http://ul.to/1pz1989y

public class RPCTest extends GWTTestCase 

@Override
public String getModuleName() 
    // TODO Auto-generated method stub
    return "de.GreetingTest";


public void testGreetingAsync() 
    GreetingServiceAsync rpcService =  (GreetingServiceAsync) SyncProxy.newProxyInstance(GreetingServiceAsync.class,"http://127.0.0.1:8888/GreetingTest.html?gwt.codesvr=127.0.0.1:9997");
    rpcService.greetServer("GWT User", new AsyncCallback<String>() 
        public void onFailure(Throwable ex)                 
            ex.printStackTrace();
            fail(ex.getMessage());              
        
        public void onSuccess(String result) 
            assertNotNull(result);               
            finishTest();//
        
    );
    delayTestFinish(1000);

验证新编译的单元 在第一次通过时忽略了 1 个具有编译错误的单元。 编译时使用 -strict 或将 -logLevel 设置为 TRACE 或 DEBUG 以查看所有错误。 [错误] 第 17 行:com.gdevelop.gwt.syncrpc.SyncProxy 类型没有可用的源代码;你忘了继承一个必需的模块吗? [错误] 找不到类型“de.client.RPCTest” [错误] 提示:以前的编译器错误可能导致此类型不可用 [错误] 提示:检查模块的继承链;它可能没有继承所需的模块,或者模块可能没有正确添加其源路径条目

【问题讨论】:

【参考方案1】:

您的 rpc 服务是异步的 - 在 testGreetingAsync 方法返回时它还没有完成。 GWTTestCase(但您正在扩展 TestCase,您可能应该更改它)对此提供支持 - 在方法末尾调用 delayTestFinish 以指示测试是异步的。然后,成功后拨打finishTest

public class RPCtest extends GWTTestCase 
    public void testGreetingAsync() 
        GreetingServiceAsync rpcService =  (GreetingServiceAsync) SyncProxy.newProxyInstance(GreetingServiceAsync.class,"http://127.0.0.1:8888/Tests.html?gwt.codesvr=127.0.0.1:9997");
        rpcService.greetServer("GWT User", new AsyncCallback() 
            public void onFailure(Throwable ex) 
                //indicate that a failure has occured
                ex.printStackTrace();
                fail(ex.getMessage());//something like this               
            
            public void onSuccess(Object result) 
                //verify the value...
                assertNotNull(result);

                //Then, once sure the value is good, finish the test
                finishTest();//This tells GWTTestCase that the async part is done
            
        );
        delayTestFinish(1000);//1000 means 'delay for 1 second, after that time out'
    


编辑更新的问题:

在模块“de.GreetingTest”中找不到测试类“de.RPCTest”;没有看到该类型的编译单元

就像您的常规 GWT 代码必须在 client 包中一样,您的 GWTTestCase 代码也必须如此 - 这也可以作为 javascript 运行,因此可以像在浏览器中一样正确地对其进行测试。根据错误,我猜你的入口点等在de.client - 这个测试也应该在那里。

【讨论】:

谢谢。但我还有另一个问题。可以管理客户端会话吗?因为服务器端想知道用户的名字,这个名字保存为一个String对象保存在HttpSession对象中。 我实际上不确定在这种情况下您甚至在进行单元测试 - servlet?如果是这样,只需制作一个正常的测试用例并创建 servlet 的副本? GWT-RPC 本身?我很确定这可行...通过仅测试 servlet,您可以设置任何其他您想要的模拟会话,甚至不需要处理 GWT 端。但答案是否定的:GWTTestCases 运行一个特殊的 Jetty 实例,您无法对其进行太多干预,因为这不是这些测试的目的。 您上面的解决方案不起作用。这可能是我的错。你试过这个吗?我认为我可以导入的带有 GWTTestCases 的工作项目会对我有很大帮助。也许你可以帮助我。 您是否收到错误消息?您是否尝试过添加断点以确保您的 rpc 服务在测试码头上工作(即您是否在测试模块中添加了 行)?有关更多详细信息,请参阅“客户端示例”下的 developers.google.com/web-toolkit/doc/latest/… - 并使用任何/所有日志和仍然不起作用的新测试更新您的问题。 感谢您的帮助 :-) 我更新了我的问题。

以上是关于GWT SyncProxy 测试的主要内容,如果未能解决你的问题,请参考以下文章

gwt-syncproxy 无法连接到地址

LoginUtils gwt-syncproxy

gwt-syncproxy - WebProject 和 Android 应用程序之间的 RPC

使用 SyncProxy 测试服务:“接收 RPC 响应时出现 IOException”

GWT 和 Android 通信。枚举序列化问题

如何集成 GWT-RPC、Android 和 GAE?