我设法解决了我的问题,并最终使用Robolectric创建了一个自定义布局来显示toast消息并测试toast内容。我在这里添加了一个GitHub项目,其中包含一个可工作的示例。
public class MainActivityTest {
@Before
public void setup() {
Robolectric.buildActivity(MainActivity.class).create();
}
@Test
public void testToastMessage() {
ToastLayoutBinding binding = DataBindingUtil.getBinding(ShadowToast.getLatestToast().getView());
binding.executePendingBindings();
assertEquals(binding.toastMsg.getContext().getString(R.string.some_toast),
binding.toastMsg.getText());
}
@Test
public void testToastDuration() {
assertEquals(Toast.LENGTH_LONG, ShadowToast.getLatestToast().getDuration());
}
}
自定义 Toast 的布局如下所示。
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<import type="android.text.TextUtils" />
<variable
name="msg"
type="String" />
</data>
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:elevation="4dp">
<TextView
android:id="@+id/toast_msg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="sans-serif"
android:gravity="center"
android:text="@{TextUtils.isEmpty(msg) ? @string/no_msg : msg}" />
</FrameLayout>
</layout>
而显示 Toast 消息的函数如下所示。
public static void showToast(Activity activity, String msg) {
if (activity == null) {
throw new IllegalArgumentException("The passed in activity cannot be null");
}
if (msg == null) {
msg = activity.getString(R.string.no_msg);
}
ToastLayoutBinding toastLayout = DataBindingUtil.inflate(
activity.getLayoutInflater(), R.layout.toast_layout, null, false);
toastLayout.setMsg(msg);
Toast toast = new Toast(activity);
toast.setView(toastLayout.getRoot());
toast.setGravity(Gravity.TOP, 0, 200);
toast.setDuration(Toast.LENGTH_LONG);
toast.show();
}
我已经使用了数据绑定,但是这也适用于其他布局膨胀方法。
希望这能帮助其他遇到同样问题的开发者。
ShadowToast.showedToast(CharSequence message)
吗? - ahasbiniUiAutomator2
可以获得对实际“Toast”的控制(因为它可以访问应用程序范围之外的视图)。 - Martin Zeitler