okhttp 的 Wesocket 模拟服务器(android)

问题描述 投票:0回答:1

我想找到一个用于 android UI 测试(聊天)的普通 websocket 模拟服务器解决方案。我找到了这个例子

但是我在这里看不到如何重现这种情况:

  1. 应用程序正常向 websocket 发送一些消息(例如,“RegisterDevice”文本)。
  2. WebServer 捕获此查询到 wedsocket 并向同一个打开的套接字发送一些模拟答案。
据我了解,okHttp 的解决方案只允许创建一些单独的 websocket 会话并在那里发送一些文本。但这不是我想要的。我需要网络服务器本身根据特定条件拦截应用程序内已打开的套接字中的消息。可以吗?

android testing websocket mocking okhttp
1个回答
0
投票
既然您想创建一个模拟 WebSocket 服务器来模拟与 Android 应用程序的交互,您是否考虑过使用来自 Square 的

MockWebServer(它也来自 OkHttp 生态系统)? MockWebServer 将允许您编写响应脚本、延迟响应以及对传入请求进行断言。

这是一个如何做到这一点的想法:

    设置MockWebServer(添加依赖)
testImplementation 'com.squareup.okhttp3:mockwebserver:4.x.x'

    启动服务器并模拟 WebSocket 响应(示例脚本)
MockWebServer mockWebServer = new MockWebServer(); mockWebServer.start(); WebSocketEchoServer webSocketEchoServer = new WebSocketEchoServer(); mockWebServer.enqueue(new MockResponse().withWebSocketUpgrade(webSocketEchoServer)); // ... point your app WebSocket client to: mockWebServer.url("/yourEndpoint")

    回显收到的相同消息(简单的 WebSocketEchoServer)
private static class WebSocketEchoServer implements WebSocketListener { @Override public void onOpen(WebSocket webSocket, Response response) { webSocket.send("Welcome!"); // Initial message when the connection is opened. } @Override public void onMessage(WebSocket webSocket, String text) { if ("RegisterDevice".equals(text)) { webSocket.send("Device Registered Successfully!"); // Mock reply. } else { webSocket.send(text); // Echo back the same message for other inputs. } } // Handle other WebSocket events (onClosing, onClosed, onFailure) as needed. }

  1. 需要将您的应用程序指向模拟服务器。确认 MockWebServer 而不是您真正的服务器正在接收 WebSocket 消息。

  2. 使用

    mockWebServer.takeRequest()

     断言收到的 WebSocket 消息,然后使用 
    mockWebServer.shutdown()
     进行清理。

最后一点,在使用 MockWebServer 时始终提供可预测的响应,以保持 UI 测试的确定性。

希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.