【发布时间】:2011-01-25 04:38:36
【问题描述】:
有人知道如何测试 Activity 上 Toast 消息的外观吗?
我正在使用类似于 OP 在this question 上发布的代码来测试我的程序从一个活动到下一个活动的流程。我还希望能够测试特定活动的 toast 消息。
【问题讨论】:
标签: android functional-testing
有人知道如何测试 Activity 上 Toast 消息的外观吗?
我正在使用类似于 OP 在this question 上发布的代码来测试我的程序从一个活动到下一个活动的流程。我还希望能够测试特定活动的 toast 消息。
【问题讨论】:
标签: android functional-testing
有谁知道如何测试 Toast 消息出现在 活动?
你不能——抱歉。我的意思是,没有办法问 Android “嘿,正在播放 Toast 吗?它看起来像什么?”。
【讨论】:
我们现在实际上可以使用 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"));
}
希望对你有帮助
【讨论】:
performClick() 并执行断言之间,toast 可能尚未出现并且会在断言完成后出现。我们如何解释这种可能性?
嗯,其实有可以测试吐司的外观。只需创建一个 Toast 的子类(例如 MyOwnToast)并在您的程序中使用它而不是 Toast。在这个子类中,您可以覆盖 show() 方法来通知您,正在显示 Toast。
此外,您可以将 Toast 以 ToastDatabase 单例的形式存储在 show() 方法中,您可以从中访问 Toast,并且在显示和销毁后也可以查看它(尚未使用 Toast 进行测试,但我通常这样做是为了让活动的结果意图在它们被销毁后保持可用于进一步的测试 - 所以用 Toasts 实现这一点应该没有问题)。
注意:也许您必须克隆 Toast 对象或其对应的 ToastDatabase 视图,因为在 Toast 被销毁后它可能会为空。希望这会有所帮助!
【讨论】:
我检查,以下工作:
if(someToast == null)
someToast = Toast.makeText(this, "sdfdsf", Toast.LENGTH_LONG);
boolean isShown = someToast.getView().isShown();
【讨论】:
您可以检查 toast 是否显示在消息中
ShadowToast.showedToast("expected message")
如果您使用的是自定义吐司
ShadowToast.showedToast("expected message", R.id.yourToastId)
【讨论】:
你可以选择Robolectric测试框架。检查toast,你可以使用如下:
assertTrue(ShadowToast.showedCustomToast("message", R.id.message)); //R.id.message: textView ID
【讨论】:
对于那些现在在 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")
)
}
}
}
【讨论】:
(科特林)呢:
onView(withText("Text of the toast"))
.inRoot(withDecorView(not(`is`(window.decorView))))
.check(matches(isDisplayed()))
【讨论】:
我正在使用它:
wait_for_text("Notification message to be verified", timeout: 30)
这是部分达到目的的替代方式。
【讨论】: