MockWebServer: llegalStateException: start() уже вызван

Я пытаюсь запустить тест с MockWebServer.

Я хотел бы сделать тест пользовательского интерфейса с издевательским ответом, чтобы я мог проверить действительные\недействительные изменения пользовательского интерфейса, такие как вход в систему или отображение ошибки в API входа в систему.

Однако каждый раз, когда я запускал код, я получал следующее исключение:

java.lang.IllegalStateException: start() already called

Код:

@RunWith(AndroidJUnit4.class)
public class UITestPlayground {

    String testUrl = "http://testurl.com/";
    MockWebServer server = new MockWebServer();

    @Rule
    public IntentsTestRule<LoginActivity> mIntentsRule = new IntentsTestRule<>(LoginActivity.class);

    @Before
    public void beforeHelper() throws IOException {
        TestHelper.removeUserAndTokenIfAny(mIntentsRule.getActivity());
        URLS.baseUrl = testUrl;
        server.url(URLS.baseUrl);
        //try to shutting down the server JUT IN CASE...
        server.shutdown();
        server.start();

    }

    @After
    public void afterHelper() throws IOException {
        server.shutdown();
    }


    @Test
    public void invalidLoginDueNotValidJSONResponse() {

        server.enqueue(new MockResponse().setBody("Something not valid JSON response"));

        String emailToBeTyped = "[email protected]";
        String passToBeTyped = "passtest";

        ViewActions.closeSoftKeyboard();
        // Type text and then press the button.
        onView(withId(R.id.login_email_edit)).perform(typeText(emailToBeTyped));
        ViewActions.closeSoftKeyboard();
        onView(withId(R.id.login_pass_edit)).perform(typeText(passToBeTyped));
        ViewActions.closeSoftKeyboard();
        onView(withId(R.id.log_in_btn)).perform(click());

        //TODO: check on valid error message appearing

    }
 }

Что я делаю не так? .start() вызывался только один раз, я даже .shutdown() на всякий случай... я не понимаю, как он мог вызываться более одного раза.

Заранее спасибо.


person Adam Varhegyi    schedule 31.01.2018    source источник


Ответы (1)


В исходном примере на github я обнаружил, что порядок обратный .

Вы фактически запускаете сервер, ЗАТЕМ устанавливаете его URL.

А не устанавливать URL, а затем запускать сервер.

Интересно.

person Adam Varhegyi    schedule 01.02.2018
comment
Вы не устанавливаете URL-адрес, который вы получаете, и поэтому вам нужно сначала запустить сервер таким образом, чтобы сервер уже начал прослушивать url:port и мог вернуть его вам. Похоже, что если вы получите URL-адрес перед запуском, сервер автоматически запустится, чтобы иметь возможность вернуть URL-адрес. - person kingston; 17.12.2019