1

我正在执行仪器测试,因为我正在调用其中一个在创建活动时调用 2 个 API 的活动。

现在我想为此活动编写仪器测试用例,我必须使用 mockito 的mockWebServer来模拟 API 响应。当我调用一个 API 时,我的模拟代码可以正常工作,但是当同时调用两个 API 时它会失败。

即使有另一种情况,假设我们有 API 来获取最近的消息数据,但在此之前,我们总是通过发送刷新令牌 来验证用户。在这种情况下,我们需要调用对用户进行身份验证的 API,然后调用另一个 API 来获取消息数据。因此,我们需要一个接一个地调用 2 个 API,比如说在一个方法中。在编写该单一方法的测试用例时,我将如何模拟身份验证 API 响应和消息 API 响应?

我应该如何处理这个问题?有没有其他方法来处理我们需要同时调用多个 API 的情况?

此外,我已经使用SystemClock.sleep(4000);了我的回调异步执行。

下面是我模拟 API 的代码:

public class MyAPIActivityTest {

@Rule
public InstantTaskExecutorRule mInstantTaskExecutorRule = new InstantTaskExecutorRule();
@Rule
public ActivityTestRule<MyAPIActivity> myAPIActivityTestRule = new ActivityTestRule<>(MyAPIActivity.class, true, false);

MockWebServer mockWebServer;
@Before
public void setUp() {
    MockitoAnnotations.initMocks(this);
}

@Test
public void checkVisibilityOfTaskListMockedValidData() throws Exception {
    myAPIActivityTestRule.launchActivity(null);
    String fileName = "json_files/valid_api_response.json";
    mockWebServer = new MockWebServer();
    int PORT_NUMBER = 50205;
    mockWebServer.start(PORT_NUMBER);
    ApiUrls.BASE_QUERY_URL = mockWebServer.url("/").toString();
    mockWebServer.enqueue(new MockResponse()
            .setBody(getStringFromFile(getContext(), fileName)));

    SystemClock.sleep(4000);

    Assert.assertEquals(View.VISIBLE, myAPIActivityTestRule.IvDataIsPresent.getVisibility());
    Assert.assertEquals(View.GONE, myAPIActivityTestRule.IvDataNotPresent.getVisibility());
}

@After
public void tearDown() throws Exception {
    mockWebServer.shutdown();
}


public static String convertStreamToString(InputStream inputStream) throws Exception {
    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
    StringBuilder stringBuilder = new StringBuilder();
    String line;
    while ((line = reader.readLine()) != null) {
        stringBuilder.append(line).append(StringCharacters.NEW_LINE);
    }
    reader.close();
    return stringBuilder.toString();
}

public static String getStringFromFile(Context context, String filePath) throws Exception {
    final InputStream stream = context.getResources().getAssets().open(filePath);

    String text = convertStreamToString(stream);
    stream.close();
    return text;
}
}

任何帮助表示赞赏。提前致谢。

4

0 回答 0