34

有人知道如何测试活动中 Toast 消息的外观吗?

我正在使用类似于 OP 在此问题上发布的代码来测试我的程序从一个活动到下一个活动的流程。我还希望能够测试有关特定活动的 toast 消息。

4

9 回答 9

20

有人知道如何测试活动中 Toast 消息的外观吗?

你不能——对不起。我的意思是,没有办法问 Android“嘿,有一个 Toast 显示吗?它看起来像什么?”。

于 2010-03-08T23:01:20.600 回答
15

我们现在实际上可以使用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"));
    }

希望这可以帮助

于 2015-06-10T20:57:49.500 回答
12

嗯,其实有可能测试吐司的外观的。只需创建一个 Toast 的子类(例如 MyOwnToast)并在您的程序中使用它而不是 Toast。在这个子类中,您可以覆盖 show() 方法来通知您,正在显示 Toast。

此外,您可以将 Toast 以 ToastDatabase 单例的形式存储在 show() 方法中,您可以从中访问 Toast,并且在显示和销毁之后也可以查看它(尚未使用 Toast 进行测试,但我经常这样做活动的结果意图是在它们被销毁后保持它们可用于进一步的测试 - 所以用 Toasts 实现这一点应该没有问题)。

当心:也许您必须克隆 Toast 对象或其对应的 ToastDatabase 视图,因为在 Toast 被销毁后它可能会为空。希望这可以帮助!

于 2010-03-29T14:28:41.970 回答
6

我检查,以下工作:

if(someToast == null)
    someToast = Toast.makeText(this, "sdfdsf", Toast.LENGTH_LONG);
boolean isShown = someToast.getView().isShown();
于 2012-05-16T19:08:19.603 回答
5

您可以检查 toast 是否通过消息显示

ShadowToast.showedToast("expected message")

如果您使用的是自定义吐司

ShadowToast.showedToast("expected message", R.id.yourToastId)
于 2016-03-30T08:25:06.860 回答
4

你可以选择Robolectric测试框架。为了检查 toast,你可以使用它如下:

assertTrue(ShadowToast.showedCustomToast("message", R.id.message)); //R.id.message: textView ID
于 2014-08-08T07:11:42.463 回答
0

对于那些现在在 2019 年使用 AndroidX 测试 API 并为 toast 使用自定义布局的人,试试这个(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")
            )
        }
    }
}
于 2019-09-20T17:02:54.087 回答
0

(科特林)呢:

onView(withText("Text of the toast"))
        .inRoot(withDecorView(not(`is`(window.decorView))))
        .check(matches(isDisplayed()))
于 2020-05-16T10:59:40.697 回答
-3

我像这样使用它:

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

这是部分服务于目的的替代方式。

于 2015-04-06T09:33:10.523 回答