Android 如何测试Toast消息的外观

Android 如何测试Toast消息的外观,android,functional-testing,Android,Functional Testing,有人知道如何在活动中测试祝酒词的外观吗 我使用的代码与OP发布的代码类似,用于测试我的程序从一个活动到下一个活动的流程。我还希望能够测试关于特定活动的toast消息 有人知道如何测试这个问题吗 在屏幕上显示Toast消息 活动 你不能,对不起。我的意思是,没有办法问安卓“嘿,一个吐司会出现吗?它看起来像什么?”。Hm,实际上有可能测试吐司的外观。只需创建Toast的子类(例如MyOwnToast),并在程序中使用该子类而不是Toast。在这个子类中,您可以覆盖show()方法来通知您正在显示To

有人知道如何在活动中测试祝酒词的外观吗

我使用的代码与OP发布的代码类似,用于测试我的程序从一个活动到下一个活动的流程。我还希望能够测试关于特定活动的toast消息

有人知道如何测试这个问题吗 在屏幕上显示Toast消息 活动

你不能,对不起。我的意思是,没有办法问安卓“嘿,一个吐司会出现吗?它看起来像什么?”。

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

此外,您还可以将Toast存储在show()方法中,类似于Toast数据库单例,在显示和销毁Toast之后,您可以从中访问Toast及其视图(我没有用Toasts测试过这个,但我经常用活动的结果意图来做,以便在它们被销毁后可以进行进一步的测试——所以用Toasts实现这个应该没有问题)


注意:可能您必须克隆Toast对象或其对应的Toast数据库视图,因为在Toast被销毁后,它可能会为空。希望这能有所帮助!

我检查一下,以下方法有效:

if(someToast == null)
    someToast = Toast.makeText(this, "sdfdsf", Toast.LENGTH_LONG);
boolean isShown = someToast.getView().isShown();
您可以选择测试框架。要检查toast,您可以按如下方式使用它:

assertTrue(ShadowToast.showedCustomToast("message", R.id.message)); //R.id.message: textView ID
我使用它的方式如下:

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

这是另一种部分达到目的的方法。

我们现在实际上可以使用
robolectric
测试toast消息。下面的示例是我们团队目前的工作方式:

    @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"));
    }

希望这对您有所帮助

您可以检查祝酒词是否通过消息显示

ShadowToast.showedToast("expected message")
如果您使用的是定制吐司

ShadowToast.showedToast("expected message", R.id.yourToastId)

对于那些在2019年使用AndroidX测试API并使用定制烤面包布局的人,请尝试以下(Kotlin):

@RunWith(AndroidJUnit4:class)
类活动单元测试{
私有lateinit变量场景:ActivityScenario
@趣味设置前(){
scenario=ActivityScenario.launch(MainActivity::class.java)
}
@测试乐趣应显示ToasterRorMessageIfsearchFieldIsEmpty(){
scenario.onActivity{activity->
activity.id\u的\u按钮。performClick()的
断言(
ShadowToast.getLatestToast().view.id\u of_textview.text.toString(),
equalTo(“待测试文本”)
)
}
}
}
那(科特林)呢:


感谢您提供的公共软件。在创建toast时,我可能会使用toast消息填充一个变量。用户将看不到它,但会给我一些检查的内容。瞧:myToast.getView().isShown()。感谢lordfinga。听起来比我描述的更简洁。好主意-但在为测试目的向生产代码中添加代码时要小心。我建议在最终生产代码中禁用此“测试代码”的方法,如果我们确实要求,可以通过检查清单中的调试标志来禁用“ActivityUnitTestCase如何断言生产代码触发了包含某某内容的Toast”,那么这样的测试不应该依赖于额外的生产代码。例如,如果您重构了该代码,您就不会希望在生产中仍然显示真正的Toast时测试中断。什么是wait_for_text()?Android API中没有使用此名称的方法。如果您使用的是Java以外的语言,则应指定。“wait_for_text”是rubyIt中葫芦API中的一个方法。在我看来,在调用
performClick()的时间之间
并确认toast可能还没有出现,并且会在断言完成后出现。我们如何解释这种可能性?Robolectric有一个shadowHandler.idleMainLooper已被弃用。但是有一个ShadowLooper.idleMainLooper()有多个实现。其中一个需要“时间”“作为触发执行的参数。。
@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")
            )
        }
    }
}
onView(withText("Text of the toast"))
        .inRoot(withDecorView(not(`is`(window.decorView))))
        .check(matches(isDisplayed()))