标签: mockwebserver

模拟服务器请求 Android Espresso UI 测试

我正在使用 Espresso 为我的 Android 应用程序编写 UI 测试,并想使用 MockWebServer 模拟 http 请求。在运行测试之前,我需要模拟身份验证响应并登录用户。

有没有办法让应用程序使用 mockwebserver,这样就不用发出实际请求,我可以使用在 mockwebserver 上排队的响应。

到目前为止,我有:

public class AuthenticationTest {

@Rule
public ActivityTestRule<Authentication> mActivityTestRule = new ActivityTestRule<>(Authentication.class);

private  Authentication activity;
private MockWebServer server;

@Before
public void signin() throws Exception {
    server = new MockWebServer();
    server.start();
    activity = mActivityTestRule.getActivity();
    MyApplication.State state = activity.getState();

    String serverUrl = server.url("/").toString();

    // Here is where I have a problem. How to force client to use mock server?

}

@Test
public void firstTest() {
    String contentType …
Run Code Online (Sandbox Code Playgroud)

android-testing android-espresso mockwebserver okhttp3

6
推荐指数
2
解决办法
5026
查看次数

如何将 MockWebServer 中的响应分配给预期的请求?

我想创建一个集成测试并模拟一个远程网络服务,如下所示:

MockWebServer server = new MockWebServer();
server.enqueue(new MockResponse()...);
server.enqueue(new MockResponse()...);
server.enqueue(new MockResponse()...);
Run Code Online (Sandbox Code Playgroud)

问题:我有一个案例,其中 3 个请求并行发送到远程。因此,顺序总是随机的。

问题:如何告诉 MockWebServer 为预期的请求分配响应?

像伪代码:

server.enqueue(new MockResponse()).forExpectedRequest(req1);
server.enqueue(new MockResponse()).forExpectedRequest(req2);
server.enqueue(new MockResponse()).forExpectedRequest(req3);
Run Code Online (Sandbox Code Playgroud)

那可能吗?

java mockwebserver okhttp3

6
推荐指数
1
解决办法
3050
查看次数

Mockwebserver 的 url 不能更改吗?

我正在使用mockwebserver进行android测试。我可以通过执行以下操作来模拟使用改造的网络服务

 NetworkServiceHelper.init(String.valueOf(server.url("/")));
Run Code Online (Sandbox Code Playgroud)

但是,我无法模拟其他 SDK(例如具有基本 url https://api.layer.com/apps/的 Atlas-Layer)发出的 Web 请求。

我执行了以下操作,但请求计数仍然为 0。

MockWebServer mockWebServer = new MockWebServer();
mockWebServer.url("https://api.layer.com/apps");
mockWebServer.enqueue(new MockResponse().setBody(getStringFromFile(getInstrumentation().getContext(), "temp.json")));
getConversation("demo", "asdf"); // makes web service all using Layer SDK
mockWebServer.getRequestCount(); // Returns 0 instead of 1
Run Code Online (Sandbox Code Playgroud)

mocking android-testing mockwebserver

5
推荐指数
0
解决办法
1312
查看次数

如何使用包含重定向的 mockwebserver 测试服务调用?

我正在使用 mockwebserver 来模拟我的 android 应用程序的请求和响应。我正在测试通过一系列 4 次服务调用的登录功能。

  1. 获取访问令牌
  2. 重定向
  3. 获取用户信息(不同的基本网址)
  4. 获取一些其他东西(原始基本网址)

我正在尝试模拟重定向调用的响应。这是我的代码:

@Test
public void testSuccessfulLogin() throws Exception {
    // Post
    server.enqueue(new MockResponse()
            .setResponseCode(HTTP_OK)
            .setBody(getStringFromFile(getInstrumentation().getContext(), "access_token.json")));

    // Redirect
    server.enqueue(new MockResponse().setResponseCode(HTTP_MOVED_TEMP));

    // GET user info
    server.enqueue(new MockResponse().setResponseCode(HTTP_OK).setBody(getStringFromFile(getInstrumentation().getContext(), "userinfo.json")));

    // GET some other stuff
    server.enqueue(new MockResponse().setResponseCode(HTTP_OK)
            .setBody(getStringFromFile(getInstrumentation().getContext(), "sts.json")));

    // Init call
    loginWithoutWaiting(Data.serviceLoginUsername, Data.serviceLoginPassword);

    // Debug (need to loop 4 times to get all 4 call paths)
    RecordedRequest request = server.takeRequest();
    request.getPath();
}
Run Code Online (Sandbox Code Playgroud)

我的测试在重定向代码处失败。我不能登入。我在这里找到了一些提示但我不完全了解发生了什么,因此目前无法使其工作。

android robolectric android-testing mockwebserver okhttp3

5
推荐指数
1
解决办法
3780
查看次数

Android MockWebServer调度器问题

在我中,MockWebServer我使用了两个不同的调度程序。一个LocalResponseDispatcher用于本地添加响应,另一个用于将QueueDispatcher一些存根响应排入队列。我在两个人之间切换时遇到了问题。事实上,当我尝试使用.setDispatcher()网络服务器的答案时,总是与前一个的响应相同。你有同样的问题吗?

android mockwebserver

5
推荐指数
1
解决办法
1409
查看次数

连续调用 MockWebServer 进行测试

我正在为一个活动编写测试,该活动连续多次调用服务器。我的 MockWebServer 混合了响应序列。例如,当我发出两个连续的请求 request1 和 request2 时,它有时会返回 request2 的 Json 以响应 request1 和 request1 的 Json 以响应 request2。如何指定 MockWebServer 必须返回指定请求的响应?

server.enqueue(new MockResponse()
                .setResponseCode(200)
                .setBody(readFromFile("response1 path"));

server.enqueue(new MockResponse()
                .setResponseCode(200)
                .setBody(readFromFile("response2 path"));
Run Code Online (Sandbox Code Playgroud)

在文档中说“将脚本响应排入队列以返回到按顺序发出的请求。第一个请求由第一个入队响应提供服务;第二个请求由第二个入队响应提供服务;依此类推。”

在并行请求的情况下,此序列不起作用。

android-testing android-espresso mockwebserver

5
推荐指数
1
解决办法
3651
查看次数

新的 MockWebServer 因 java.lang.NoClassDefFoundError 失败(TaskRunner$RealBackend)

我正在尝试使用 okhttp3.mockwebserver.MockWebServer 在 Android 上进行一些仪表测试。这是我在 build.gradle (:app) 文件中用于仪器测试的内容:

    androidTestImplementation 'androidx.annotation:annotation:1.1.0'
    androidTestImplementation 'androidx.test:runner:1.3.0'
    androidTestUtil 'androidx.test:orchestrator:1.3.0'
    androidTestImplementation 'androidx.test:runner:1.3.0'
    androidTestImplementation 'androidx.test:rules:1.3.0'
    androidTestImplementation 'androidx.test:core:1.3.0'
    androidTestImplementation 'org.mockito:mockito-android:2.7.22'
    androidTestImplementation 'com.squareup.okhttp3:mockwebserver:4.9.0'
Run Code Online (Sandbox Code Playgroud)

这是我在 andoidTest/java 文件夹中的 java 文件:

import android.content.Intent;

import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.rule.ActivityTestRule;

import org.junit.Rule;
import org.junit.Test;

import okhttp3.mockwebserver.MockResponse;
import okhttp3.mockwebserver.MockWebServer;


public class MainActivityTest {

  MockWebServer server = new MockWebServer();

  @Rule
  public ActivityTestRule<MainActivity> activityRule
      = new ActivityTestRule<>(MainActivity.class);

  @Test
  public void testNoSessionData() {
    try {
      server.enqueue(new MockResponse().setBody("[]").setResponseCode(200));
      server.start(8080);
      activityRule.launchActivity(
          new Intent(
              InstrumentationRegistry.getInstrumentation().getContext(),
              MainActivity.class
          ).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
      );
    } catch (Exception e) …
Run Code Online (Sandbox Code Playgroud)

android mockwebserver instrumented-test

5
推荐指数
1
解决办法
2140
查看次数

测试时如何从 MockWebServer 中提取参数?

我正在向 MockWebServer 发送请求。我想检查所述请求的参数以进行测试。如何从 MockWebServer 中提取它?

java okhttp mockwebserver

5
推荐指数
1
解决办法
2801
查看次数

在 Kotlin 流程中运行 Retrofit 协程测试时出现 TimeoutCancellationException

我有一个存储库,它创建一个流程,在其中发出挂起的 Retrofit 方法的结果。这在应用程序中有效,但我想对代码运行测试。

我在测试中使用 kotlinx-coroutines-test v1.6.0 和 MockWebServer v4.9.3。当我尝试运行测试时,我得到:

Timed out waiting for 1000 ms
kotlinx.coroutines.TimeoutCancellationException: Timed out waiting for 1000 ms
    at app//kotlinx.coroutines.TimeoutKt.TimeoutCancellationException(Timeout.kt:184)
    at app//kotlinx.coroutines.TimeoutCoroutine.run(Timeout.kt:154)
    at app//kotlinx.coroutines.test.TestDispatcher.processEvent$kotlinx_coroutines_test(TestDispatcher.kt:23)
    at app//kotlinx.coroutines.test.TestCoroutineScheduler.tryRunNextTask(TestCoroutineScheduler.kt:95)
    at app//kotlinx.coroutines.test.TestCoroutineScheduler.advanceUntilIdle(TestCoroutineScheduler.kt:110)
    at app//kotlinx.coroutines.test.TestBuildersKt__TestBuildersKt.runTestCoroutine(TestBuilders.kt:212)
    at app//kotlinx.coroutines.test.TestBuildersKt.runTestCoroutine(Unknown Source)
    at app//kotlinx.coroutines.test.TestBuildersKt__TestBuildersKt$runTest$1$1.invokeSuspend(TestBuilders.kt:167)
    at app//kotlinx.coroutines.test.TestBuildersKt__TestBuildersKt$runTest$1$1.invoke(TestBuilders.kt)
    at app//kotlinx.coroutines.test.TestBuildersKt__TestBuildersKt$runTest$1$1.invoke(TestBuilders.kt)
    at app//kotlinx.coroutines.test.TestBuildersJvmKt$createTestResult$1.invokeSuspend(TestBuildersJvm.kt:13)
    (Coroutine boundary)
    at app.cash.turbine.ChannelBasedFlowTurbine$awaitEvent$2.invokeSuspend(FlowTurbine.kt:247)
    at app.cash.turbine.ChannelBasedFlowTurbine$withTimeout$2.invokeSuspend(FlowTurbine.kt:215)
    at app.cash.turbine.ChannelBasedFlowTurbine.awaitItem(FlowTurbine.kt:252)
    at ogbe.eva.prompt.home.HomeRepositoryTest$currentTask when server responds with error emits failure$1$1.invokeSuspend(HomeRepositoryTest.kt:90)
    at app.cash.turbine.FlowTurbineKt$test$2.invokeSuspend(FlowTurbine.kt:86)
    at ogbe.eva.prompt.home.HomeRepositoryTest$currentTask when server responds with error emits failure$1.invokeSuspend(HomeRepositoryTest.kt:89)
    at kotlinx.coroutines.test.TestBuildersKt__TestBuildersKt$runTestCoroutine$2.invokeSuspend(TestBuilders.kt:208)
    (Coroutine creation stacktrace)
    at app//kotlinx.coroutines.intrinsics.UndispatchedKt.startCoroutineUndispatched(Undispatched.kt:184) …
Run Code Online (Sandbox Code Playgroud)

android kotlin mockwebserver retrofit2 kotlin-flow

5
推荐指数
1
解决办法
6504
查看次数

OkHttp MockWebServer 作为独立的模拟服务器

我已经让 OkHttp MockWebServer 与 Android 的 Espresso UI 测试一起运行。一切正常。

现在我想让 MockWebServer 在我的本地主机上独立运行,以便其他客户端能够连接到它。Appium、互联网浏览器等客户端将从服务器获取模拟响应。我想重用已经准备好的模拟代码,而不是使用像 Wiremock 这样的东西。

我的方法是在单独的 Java/Kotlin 项目中构建独立的 jar 工件,该项目将使用 cmd 行在我的计算机上运行。示例代码如下。

问题是我无法连接到服务器的显示 URL 地址。我正在尝试 ping 命令等。但找不到服务器。
不知道下一步要尝试或设置什么。
谢谢

错误信息:

ping http://kubernetes.docker.internal:62037 
Ping request could not find host http://kubernetes.docker.internal:62037. Please check the name and try again.
Run Code Online (Sandbox Code Playgroud)

模拟服务器:

object MockServer {

fun init() {
    GlobalScope.launch(Dispatchers.IO) {
        val mockWebServer = MockWebServer()
        mockWebServer.start()
        println("Server url: " + mockWebServer.url("").toString())
    }
}
Run Code Online (Sandbox Code Playgroud)

主要类别:

fun main(args: Array<String>) {
   MockServer.init()
   println("MockServer running")
   Thread.sleep(30000) // main thread is sleeping …
Run Code Online (Sandbox Code Playgroud)

okhttp mockwebserver

5
推荐指数
0
解决办法
553
查看次数