标签: mockwebserver

方形改造服务器模拟测试

在使用方形改造框架时,模拟服务器进行测试的最佳方法是什么.

潜在方式:

  1. 创建一个新的改造客户端并将其设置在RestAdapter.Builder().setClient()中.这涉及解析Request对象并将json作为Response对象返回.

  2. 将此带注释的接口实现为模拟类,并使用它来代替RestAdapter.create()提供的版本(不要测试gson序列化)

理想情况下,我希望模拟服务器提供json响应,以便我可以同时测试gson序列化.

任何例子都将非常感谢.

testing android mocking retrofit mockwebserver

90
推荐指数
8
解决办法
5万
查看次数

使用Retrofit和MockWebServer模拟无网络

我想在使用RetroFit和时模拟无网络案例MockWebServer.

我正在测试使用Espresso和提供MockWebServers url到RestAdapter我开始测试之前.这非常适合模拟服务器响应等等,但是我无法看到一种简单的方法来编写java.net.ConnectException设备没有网络时引发的异常的脚本.我可以看到MockResponse允许限制模拟等,但不是自定义异常.

我知道我可以嘲笑使用的实际web api接口,retrofit但是如果可能的话,我想使用与其他测试相同的方法MockWebServer.

我想我只是错过了一些简单的东西:)

谢谢

android retrofit mockwebserver

26
推荐指数
3
解决办法
1万
查看次数

用Robolectric模拟HttpResponse

使用Robolectric 2.3-SNAPSHOT,我想测试一个在后台执行请求的对象.为了隔离它,我试图模拟返回的HttpResponse,在投入几个小时后没有成功.

我创建了一个任何人都可以克隆的项目.模拟运行./gradlew检查 https://github.com/Maragues/RobolectricDummyProject(git clone https://github.com/Maragues/RobolectricDummyProject.git)

我试过了

但测试失败是因为他们查询真实的URL

  private static final String MOCKED_WORD = "MOCKED";

  @Test
  public void mockedRequestUsingMockServer() throws Exception {
    mMockWebServer.enqueue(new MockResponse().setBody(MOCKED_WORD));
    mMockWebServer.play();

    Robolectric.getFakeHttpLayer().interceptHttpRequests(false);
    Robolectric.getFakeHttpLayer().interceptResponseContent(false);

    String result = request.loadDataFromNetwork();

    assertEquals(MOCKED_WORD, result);
  }

  @Test
  public void mockedRequestUsingRobolectric() throws Exception {
    Robolectric.setDefaultHttpResponse(200, MOCKED_WORD);

    String result = request.loadDataFromNetwork();

    assertEquals(MOCKED_WORD, result);
  }
Run Code Online (Sandbox Code Playgroud)

执行请求的代码

public String loadDataFromNetwork() throws Exception {
    // With Uri.Builder class we can build our url is a safe manner
    Uri.Builder uriBuilder = Uri.parse("http://robospice-sample.appspot.com/reverse").buildUpon(); …
Run Code Online (Sandbox Code Playgroud)

android robolectric mockwebserver

11
推荐指数
2
解决办法
5926
查看次数

如何使 android:usesCleartextTraffic="true" 仅用于仪器测试?

我使用RESTMock我的仪器测试,但只有当我设置工作usesCleartextTraffictrue在我的清单。不过,我只希望仪器测试也是如此。有没有办法做到这一点?

我尝试在androidTest文件夹中创建一个新的清单文件。测试运行,但它们像usesCleartextTraffic仍然一样失败false

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="my.package">

    <application android:usesCleartextTraffic="true" />

</manifest>
Run Code Online (Sandbox Code Playgroud)

我知道 RESTMock 从版本 0.3.2 开始支持 https,但我宁愿不必处理它。我实际上遵循了他们的指南,最终得到了 OkHttp3 的这个错误:

java.lang.AssertionError: java.security.NoSuchAlgorithmException: The BC provider no longer provides an implementation for KeyPairGenerator.RSA. Please see https://android-developers.googleblog.com/2018/03/cryptography-changes-in-android-p.html for more details.

有任何想法吗?


编辑:

我按照这个答案并将我创建的这个清单移动到debug源文件夹,然后它就可以工作了。现在该android:usesCleartextTraffic="true"选项仅适用于我的调试版本,由仪器测试使用,因此它可以工作,但它仍然不是正确的解决方案。

android android-espresso mockwebserver android-instrumentation

11
推荐指数
1
解决办法
7377
查看次数

MockWebServer的takeRequest()方法需要很长时间才能响应或挂起

我在Android JUnit测试中使用MockWebServer库.我正在测试一个调用服务器的SDK.所以我正在使用MockWebServer覆盖这些服务器URL并捕获SDK发送的内容以对其进行断言.

我遇到的问题是,如果我尝试server.takeRequest()将其分配给一个新RecordedRequest变量,那么测试会挂起第二个server.takeRequest(),有时甚至是第一个 - 如果我在模拟器上运行它会挂起第server.takeRequest()一种方法,但如果我在我的物理Android设备上运行它,它会冻结第二种方法server.takeRequest()方法.

public void testSomething() {
  final MockWebServer server = new MockWebServer();

  try {
    server.play();
    server.enqueue(new MockResponse().setBody("")
      .setResponseCode(HttpURLConnection.HTTP_INTERNAL_ERROR));
    server.enqueue(new MockResponse().setBody("")
      .setResponseCode(HttpURLConnection.HTTP_OK));
    server.enqueue(new MockResponse().setBody("")
      .setResponseCode(HttpURLConnection.HTTP_OK));

    URL url = server.getUrl("/");
    // This internal method overrides some of the hardcoded URLs 
    // within the SDK that I'm testing.
    Util.overrideUrls(url.toString()) 

    // Do some server calls via the SDK utilizing the mock server url.

    RecordedRequest requestFor500 = server.takeRequest(); …
Run Code Online (Sandbox Code Playgroud)

java junit android mocking mockwebserver

9
推荐指数
2
解决办法
2558
查看次数

MockWebServer和带回调的Retrofit

我想模拟MockWebServer的网络通信.不幸的改造回调永远不会被调用.我的代码:

    MockWebServer server = new MockWebServer();
    server.enqueue(new MockResponse().setResponseCode(200).setBody("{}"));
    server.play();

    RestAdapter restAdapter = new RestAdapter.Builder().setConverter(new MyGsonConverter(new Gson()))
            .setEndpoint(server.getUrl("/").toString()).build();

    restAdapter.create(SearchService.class).getCount(StringUtils.EMPTY,
            new Callback<CountContainer>() {

                @Override
                public void success(CountContainer countContainer, Response response) {
                    System.out.println("success");
                }

                @Override
                public void failure(RetrofitError error) {
                    System.out.println("error");
                }
            });

    server.shutdown();
Run Code Online (Sandbox Code Playgroud)

当我在没有回调的情况下使用改装时,它可以工作.

android retrofit mockwebserver

9
推荐指数
1
解决办法
3844
查看次数

Espresso Mock Web 服务器不等待 OkHttp 空闲资源和 Dagger Hilt

我正在尝试使用Espresso和为我的 Fragments 编写 UI 测试MockWebServer。我OkHttp Idling Resource用来告诉 Espresso 等待 API 调用完成。

但不知何故,有时我的测试有效,但有时无效,因为Espresso在服务请求之前就完成了它的工作。所以我的 recyclerView 项目点击测试失败。

我不明白为什么 espresso 不等待 API 调用?任何人都可以帮忙吗?

这是我的测试课

@MediumTest
@HiltAndroidTest
@UninstallModules(PersistenceModule::class, NetworkModule::class)
class MainFragmentTest {

    @get:Rule
    var hiltRule = HiltAndroidRule(this)

    private val mockWebServer = MockWebServer()

    @Inject
    lateinit var okHttp3IdlingResource: OkHttp3IdlingResource

    @Before
    fun setUp() {
        hiltRule.inject()
        // Prepare Mock Web Server
        mockWebServer.start(8080)
        IdlingRegistry.getInstance().register(okHttp3IdlingResource)
    }

    @Test
    fun mainFragmentTest(){

        // Prepare Mock Web Server
        mockWebServer.dispatcher = object : Dispatcher() {
            override fun dispatch(request: …
Run Code Online (Sandbox Code Playgroud)

android okhttp android-espresso mockwebserver dagger-hilt

9
推荐指数
0
解决办法
548
查看次数

如何在 JUnit 测试中将 MockWebServer 端口设置为 WebClient?

我正在使用spring-bootwith WebClient,它作为 bean 自动装配。

问题:在编写junit集成测试时,我必须使用 okhttp MockWebServer。此模拟始终在随机端口上启动,例如localhost:14321.

现在我WebClient当然有一个固定的网址,它将请求发送到。该 url 可能由application.properties类似的参数给出webclient.url=https://my.domain.com/,因此我可以在junit测试中覆盖该字段。但只是静态的。

问题:如何WebClient在 a 中重置bean,@SpringBootTest以便它始终将请求发送到我的模拟服务器?

@Service
public class WebClientService {
     public WebClientService(WebClient.Builder builder, @Value("${webclient.url}" String url) {
          this.webClient = builder.baseUrl(url)...build();
     }

     public Response send() {
          return webClient.body().exchange().bodyToMono();
     }
}

@Service
public void CallingService {
      @Autowired
      private WebClientService service;

      public void call() {
           service.send();
      }
}


@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class MyWebTest …
Run Code Online (Sandbox Code Playgroud)

java spring spring-boot mockwebserver okhttp3

8
推荐指数
1
解决办法
6570
查看次数

使用 JUnit5 assertThrows 和 MockWebServer 测试挂起函数的异常

我们如何使用 MockWebServer 测试应该抛出异常的挂起函数?

fun `Given Server down, should return 500 error`()= testCoroutineScope.runBlockingTest {

    // GIVEN
    mockWebServer.enqueue(MockResponse().setResponseCode(500))

    // WHEN
    val exception = assertThrows<RuntimeException> {
        testCoroutineScope.async {
            postApi.getPosts()
        }

    }

    // THEN
    Truth.assertThat(exception.message)
        .isEqualTo("com.jakewharton.retrofit2.adapter.rxjava2.HttpException: HTTP 500 Server Error")
}
Run Code Online (Sandbox Code Playgroud)

postApi.getPosts()直接在内部调用 assertThrows是不可能的,因为它不是一个挂起函数,我尝试使用async,launch

 val exception = testCoroutineScope.async {
            assertThrows<RuntimeException> {
                launch {
                    postApi.getPosts()
                }
            }
        }.await()
Run Code Online (Sandbox Code Playgroud)

org.opentest4j.AssertionFailedError: Expected java.lang.RuntimeException to be thrown, but nothing was thrown.但每个变体的测试都会失败。

android unit-testing mockwebserver kotlin-coroutines

8
推荐指数
2
解决办法
4627
查看次数

Mockwebserver 关闭失败

当我执行mockwebserver.shutdown()时,我收到此错误java.io.ioexception放弃等待执行器关闭。我可以在调试跟踪中看到服务器几乎没有导致错误的活动线程。有没有办法检查并等待活动线程?

okhttp mockwebserver

8
推荐指数
0
解决办法
862
查看次数