3

我有依赖于 Google App Engine 的 Channel API 的 Java servlet。我正在尝试为该代码编写单元测试,但我对如何编写存根客户端以接收来自 servlet 的响应消息感到非常困惑,而不是我总是不得不依赖使用实际网页作为我的测试客户端。我的 servlet 非常简单:

ChannelService channelService = ChannelServiceFactory.getChannelService();
channelService.sendMessage(new ChannelMessage(someKey, "ECHO: " + someMsg));

通常,我在我的测试客户端(一个网页)中阅读此内容。但是,我想编写可以使用 jUnit 或 TestNG 等框架进行测试的单元测试。在阅读了 Google关于对其 Java 服务进行单元测试的页面后,我尝试了一些方法,例如在我的测试类中使用LocalServiceTestHelper对象并使用LocalChannelServiceTestConfig对象对其进行配置。这样做的结果是我的测试类可以创建 的实例LocalChannelService,该类似乎实现与 相同的方法ChannelService

然而:

  • 两个类之间没有任何稳健的关系(不实现类似的接口,不在同一个类层次结构中......)。使我无法将 LocalChannelService 对象作为模拟对象注入到我的 servlet 中。
  • LocalChannelService API 上没有任何文档(非常感谢,Google)。
  • 他们的本地单元测试页面上也没有关于如何测试 Channel API 的文档(再次感谢 Google)

所以后来我看到了这篇关于如何在 Java 代码中进行测试的文章。ChannelService不幸的是,给出的唯一相关答案是Python。好吧,你瞧,谷歌确实为 Python GAE 服务器开发人员提供了为谷歌服务编写存根客户端的工具,正如他们的Python 本地单元测试指南中所述。令人难以置信的是,他们竟然忽略了为 Java 做同样的事情!


既然我已经摆脱了所有这些(如果我听起来有点慌张,请道歉),我真的很想知道,依赖 Google App Engine 的 Channel API 测试 Java 代码的最佳方法是什么?我真的希望依靠测试工具而不是网页。我是否必须以某种方式从 Java 调用 Google 的Javascript Client for Channel API?必须有更好的方法来使用模拟对象或存根。


更新 1

使用了更好的名称,“Google App Engine”而不是“App Engine”

4

2 回答 2

4

您可以从 LocalServiceTestHelper 获取 LocalChannelService,将假客户端连接到它,然后从中获取消息:

    LocalChannelService svc = (LocalChannelService) LocalServiceTestHelper.getLocalService("channel");
    ChannelManager channelManager = svc.getChannelManager();
    String connectionId = channelManager.connectClient(token);

    // send a message

    String message = channelManager.getNextClientMessage(token, connectionId);
    assertEquals("123", message);
于 2013-05-20T20:22:23.177 回答
0

这些只是我对 Channel API 进行单元测试的想法:

  1. 你不需要模拟。只需使用实际的 API。只是假装它有效。即使您的消息发送失败,它也不会返回任何失败,因此无论如何您都无法测试。

  2. 有备份。我认为您不能依赖 Channel API。消息无法显示。我个人认为您需要一个备份,例如一个响应性不如 Channel API 的轮询 API,但至少可以工作。

  3. 对您的备份 API 进行单元测试。

  4. 使用 Selenium 在浏览器中测试 Channel API。

于 2012-10-01T21:37:26.407 回答