【问题标题】:How to mock API's before launching the UI test?如何在启动 UI 测试之前模拟 API?
【发布时间】:2021-01-31 06:11:26
【问题描述】:

我想在活动启动之前模拟 API 响应以测试实时场景。我正在使用 rxjava 和 viewmodel 在实际活动类中进行 API 调用。我创建了一个自定义调度程序来模拟 API 调用并在 BaseUItest 类中调用它。但是当我启动测试时这个过程不起作用,因为我看到没有数据加载并且没有进行模拟 API 调用。这是 BaseUItest:

open class BaseUITest {
    protected var mockWebServer = MockWebServer()

    @Before
    open fun setup() {
        mockWebServer.start(5000)
        mockWebServer.dispatcher = ApiDispatcher()
    }

    @After
    open fun teardown() {
        mockWebServer.shutdown()
    }
}

在模拟 API 之前,我还需要模拟视图模型吗?我在这里做什么?请帮忙。

【问题讨论】:

  • 你的代码是否完整? github.com/square/okhttp/tree/master/mockwebserver 在这个例子中,我认为你需要向服务器询问它的 url 并将其传递给你的处理类......我猜......
  • @sak:你实现了你正在做的事情吗?我被困在同一个场景中,无法找到方向。你能帮忙吗?
  • @MonsterBrain 无法通过询问服务器来理解。我是否必须提及我要模拟的端点路径或我的服务器的 baseURL
  • @Emjey 是的。您可以通过传递 server.url("your/api/endpoint") 函数来获取端点的 url ...更多详细信息在答案中

标签: android android-espresso android-testing


【解决方案1】:

在调度程序中,您需要检查端点,并为此模拟服务器生成自己的模拟响应。例如。

val server = MockWebServer()

val dispatcher: Dispatcher = object : Dispatcher() {
            @Throws(InterruptedException::class)
            override fun dispatch(request: RecordedRequest): MockResponse? {
                when (request.path) {
                    "/v1/login/auth/" -> return MockResponse().setResponseCode(200)
                    "/v1/profile/info" -> return MockResponse().setResponseCode(200)
                        .setBody("{\"info\":{\"name\":\"Lucas Albuquerque\",\"age\":\"21\",\"gender\":\"male\"}}")
                }
                return MockResponse().setResponseCode(404)
            }
        }
        server.setDispatcher(dispatcher)

在调用部分,您可以通过

fun getUrl(): HttpUrl {
    return server.url("/v1/profile/info")
}

这将返回带有 json 正文的服务器响应,如调度程序中所述。

【讨论】:

    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 2015-05-10
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多