我正在使用 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) 我想创建一个集成测试并模拟一个远程网络服务,如下所示:
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)
那可能吗?
我正在使用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) 我正在使用 mockwebserver 来模拟我的 android 应用程序的请求和响应。我正在测试通过一系列 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)
在我中,MockWebServer
我使用了两个不同的调度程序。一个LocalResponseDispatcher
用于本地添加响应,另一个用于将QueueDispatcher
一些存根响应排入队列。我在两个人之间切换时遇到了问题。事实上,当我尝试使用.setDispatcher()
网络服务器的答案时,总是与前一个的响应相同。你有同样的问题吗?
我正在为一个活动编写测试,该活动连续多次调用服务器。我的 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)
在文档中说“将脚本响应排入队列以返回到按顺序发出的请求。第一个请求由第一个入队响应提供服务;第二个请求由第二个入队响应提供服务;依此类推。”
在并行请求的情况下,此序列不起作用。
我正在尝试使用 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) 我正在向 MockWebServer 发送请求。我想检查所述请求的参数以进行测试。如何从 MockWebServer 中提取它?
我有一个存储库,它创建一个流程,在其中发出挂起的 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) 我已经让 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) mockwebserver ×10
android ×4
okhttp3 ×3
java ×2
okhttp ×2
kotlin ×1
kotlin-flow ×1
mocking ×1
retrofit2 ×1
robolectric ×1