Как проверить появление тост-сообщения

Кто-нибудь знает, как проверить появление сообщения Toast в Activity?

Я использую код, аналогичный тому, который OP опубликовал на этот вопрос для тестирования моей программы от одного занятия к другому. Я также хотел бы иметь возможность тестировать всплывающие сообщения о конкретных действиях.


person Adrian    schedule 08.03.2010    source источник


Ответы (9)


Кто-нибудь знает, как проверить появление сообщения Toast в Activity?

Вы не можете - извините. Под этим я подразумеваю, что у Android нет возможности спросить: «Привет, есть тост? И как он выглядит?».

person CommonsWare    schedule 08.03.2010
comment
Спасибо за это CommonsWare. Я, вероятно, сделаю что-то вроде заполнения переменной тост-сообщением при создании тоста. Он будет невидим для пользователя, но даст мне кое-что для изучения. - person Adrian; 12.03.2010
comment
Вуаля: myToast.getView (). IsShown (). - person Dzmitry Lazerka; 08.08.2012

Фактически теперь мы можем тестировать всплывающие сообщения, используя robolectric. В приведенном ниже примере показано, как наша команда делает это сейчас:

    @Test
    public void ccButtonDisplaysToast() throws NullPointerException {
        Button ccRedButton = (Button) findViewById(R.id.cc_red);
        cc_red.performClick(); --> this calls the actual onClickListener implementation which has the toast.
        ShadowLooper.idleMainLooper(YOUR_TIME_HERE); --> This may help you.
        assertThat(ShadowToast.getTextOfLatestToast().toString(), equalTo("TEST_YOUR_TEXT_HERE"));
    }

Надеюсь это поможет

person user2511882    schedule 10.06.2015
comment
Мне кажется, что между моментом, когда вы вызываете performClick() и делаете assert, возможно, тост еще не появился и появится после завершения assert. Как мы учитываем эту возможность? - person Code-Apprentice; 16.06.2015
comment
У Robolectric есть shadowHandler.idleMainLooper, который устарел. Однако существует ShadowLooper.idleMainLooper (), который имеет несколько реализаций. Один из них использует время в качестве параметров для запуска выполнения .. - person user2511882; 16.06.2015

Хм, вообще-то есть возможность проверить внешний вид тоста. Просто создайте подкласс Toast (например, MyOwnToast) и используйте его в своей программе вместо Toast. В этом подклассе вы можете перезаписать метод show (), чтобы уведомлять вас о том, что отображается тост.

Кроме того, вы можете сохранить Toast в методе show () в виде синглтона ToastDatabase, откуда вы можете получить доступ к Toast и его просмотру также после того, как он был показан и уничтожен (не тестировал это с Toasts, но я часто это делаю с результирующими намерениями действий, чтобы сохранить их доступными для дальнейших тестов после того, как они были уничтожены - поэтому не должно быть проблем реализовать это с помощью Toasts).

Остерегайтесь: возможно, вам нужно клонировать объект Toast или его соответствующее представление для ToastDatabase, потому что, вероятно, он будет нулевым после уничтожения Toast. Надеюсь это поможет!

person ubuntudroid    schedule 29.03.2010
comment
Спасибо за лордфинга. Похоже на более удобное решение, чем я описал. - person Adrian; 29.03.2010
comment
Хорошая идея, но будьте осторожны при добавлении кода в производственный код только для целей тестирования. Я бы порекомендовал способ отключить этот тестовый код в окончательном производственном коде, возможно, проверив флаг отладки в манифесте stackoverflow.com/ a / 4277868/383414 - person Richard Le Mesurier; 26.04.2012

Проверяю, работает следующее:

if(someToast == null)
    someToast = Toast.makeText(this, "sdfdsf", Toast.LENGTH_LONG);
boolean isShown = someToast.getView().isShown();
person Oleksii Kolotylenko    schedule 16.05.2012
comment
Если мы действительно спрашиваем, как ActivityUnitTestCase может утверждать, что производственный код запустил тост с таким-то содержимым, то такой тест не должен зависеть от дополнительного производственного кода. Если, например, вы реорганизовали этот код, вы бы не хотели, чтобы тест прерывался, когда в процессе производства по-прежнему отображается настоящий тост. - person Phlip; 29.09.2013

Вы можете проверить, что тост был показан по сообщению

ShadowToast.showedToast("expected message")

Если вы используете свой тост

ShadowToast.showedToast("expected message", R.id.yourToastId)
person Kevin Crain    schedule 30.03.2016

вы можете выбрать тестовую среду Robolectric. Для проверки тоста вы можете использовать его, как показано ниже:

assertTrue(ShadowToast.showedCustomToast("message", R.id.message)); //R.id.message: textView ID
person panda    schedule 08.08.2014

Для тех, кто сейчас использует AndroidX Test API в 2019 году и использует настраиваемый макет для тостов, попробуйте следующее (Kotlin):

@RunWith(AndroidJUnit4:class)
class ActivityUnitTest {
    private lateinit var scenario: ActivityScenario<MainActivity>

    @Before fun setUp() {
        scenario = ActivityScenario.launch(MainActivity::class.java)
    }

    @Test fun shouldDisplayToastErrorMessageIfSearchFieldIsEmpty() {
        scenario.onActivity { activity ->
            activity.id_of_button.performClick()
            assertThat(
                ShadowToast.getLatestToast().view.id_of_textview.text.toString(),
                equalTo("Text to be tested")
            )
        }
    }
}
person OzzyTheGiant    schedule 20.09.2019

Что насчет (Котлина):

onView(withText("Text of the toast"))
        .inRoot(withDecorView(not(`is`(window.decorView))))
        .check(matches(isDisplayed()))
person Jan Kubovy    schedule 16.05.2020

Я использую это как:

wait_for_text("Notification message to be verified", timeout: 30)

Это альтернативный способ, который частично служит цели.

person Aditya Saxena    schedule 06.04.2015
comment
Что такое wait_for_text ()? В Android API нет метода с таким именем. - person Code-Apprentice; 16.06.2015
comment
Если вы используете язык, отличный от Java, вам следует указать. - person Code-Apprentice; 16.06.2015
comment
wait_for_text - это метод в Calabash api в ruby - person Aditya Saxena; 01.07.2015