Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android警报对话框单元测试_Android_Unit Testing_Robolectric - Fatal编程技术网

Android警报对话框单元测试

Android警报对话框单元测试,android,unit-testing,robolectric,Android,Unit Testing,Robolectric,警报片段 AlertManagerImpl AlertManagerImplTest 在这里,我创建了用于我的项目的AlertManager。因此,实现工作正常。但是现在我面临一个挑战,我需要为这个实现编写一些单元测试。特别是我需要测试以下场景 显示一个警报->验证它是否正在显示 尝试显示一个带有“死机”活动的警报->验证没有发生崩溃 显示10个警报->验证是否显示了所有10个警报(以验证在大多数情况下我们是否可以信任该方法) 我创建了一个测试类来测试AlertManagerImpl的一个函

警报片段

AlertManagerImpl

AlertManagerImplTest

在这里,我创建了用于我的项目的AlertManager。因此,实现工作正常。但是现在我面临一个挑战,我需要为这个实现编写一些单元测试。特别是我需要测试以下场景

  • 显示一个警报->验证它是否正在显示
  • 尝试显示一个带有“死机”活动的警报->验证没有发生崩溃
  • 显示10个警报->验证是否显示了所有10个警报(以验证在大多数情况下我们是否可以信任该方法)
我创建了一个测试类来测试AlertManagerImpl的一个函数 班级。我需要确认警报是否显示。我读了一些帖子 有人说机器人分子技术很好,但我不太好 在单元测试中,如果您可以建议任何其他解决方案,也欢迎。如果有人帮我,我将不胜感激


实际上,到目前为止您所做的(
AlertManagerImplTest
)并不是单元测试。这更像是一个集成测试,因为它使用Robolectric运行,初始化应用程序并在设备或模拟器上运行

如果您想在真正的单元测试中测试您的
AlertManagerImpl
,您应该编写一些简单的JUnit测试,并模拟/剔除您的
AlertManagerImpl
使用的所有依赖项(
FragmentActivity
AlertFragment
)。 您可以编写自己的mock/stub类,或者使用Mockito之类的模拟框架。如果您想进一步模拟调用,如
new AlertFragment()
,则必须使用更强大的模拟框架,如PowerMock。你也可以考虑重构你的代码(例如使用依赖注入),这样你就不必使用PrimoCK了。
public class AlertFragment extends DialogFragment {

    private static final String TAG = "DeliveryRequestErrMsg";

    private String mMsg;
    private String mTitle;
    private AlertDismissListener mAlertDismissListener;
    private FragmentManager mFragmentManager;

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        return new AlertDialog
                .Builder(getActivity())
                .setTitle(mTitle)
                .setMessage(mMsg)
                .setNegativeButton(R.string.cart_btn_dismiss, null)
                .create();
    }

    @Override
    public void onDismiss(DialogInterface dialog) {
        super.onDismiss(dialog);
        mAlertDismissListener.onDismiss(this);
    }

    public AlertFragment title(String title) {
        this.mTitle = title;
        return this;
    }

    public AlertFragment msg(String mMsg) {
        this.mMsg = mMsg;
        return this;
    }

    public AlertFragment fragmentMgr(FragmentManager fragmentManager) {
        mFragmentManager = fragmentManager;
        return this;
    }

    public AlertFragment onDismiss(AlertDismissListener alertDismissListener) {
        this.mAlertDismissListener = alertDismissListener;
        return this;
    }

    public void show() {
        try {
            super.show(mFragmentManager, getClass().getName());
        } catch (Exception e) {
            Log.e(TAG, "show: ", e);
        }
    }

    interface AlertDismissListener {
        void onDismiss(AlertFragment fragment);
    }

    public String getMsg() {
        return mMsg;
    }

    public String getTitle() {
        return mTitle;
    }
}
public class AlertManagerImpl implements AlertManager {

        private List<AlertFragment> mListOfMessageShown = new ArrayList<>();

        @Override
        public boolean isMessageDisplayed(@Nonnull String message) {
            boolean isAlreadyShown = false;
            for (AlertFragment deliveryRequestErrMsgFragment : mListOfMessageShown) {
                if (message.equals(deliveryRequestErrMsgFragment.getMsg())) {
                    isAlreadyShown = true;
                    break;
                }
            }
            return isAlreadyShown;
        }

        @Override
        public void showAlertMessage(@Nullable String title, String msg, FragmentActivity activity) {
            AlertFragment deliveryRequestErrMsgFragment = new AlertFragment()
                    .title(title)
                    .msg(msg)
                    .onDismiss(fragment -> mListOfMessageShown.remove(fragment))
                    .fragmentMgr(activity.getSupportFragmentManager());
            deliveryRequestErrMsgFragment.show();
            mListOfMessageShown.add(deliveryRequestErrMsgFragment);
        }

        @Override
        public void showAlertMessageWithoutDuplicates(@Nullable String title, String msg, FragmentActivity activity) {
            if (!isMessageDisplayed(msg)) {
                showAlertMessage(title, msg, activity);
            }
        }
    }
    public interface AlertManager {

    /**
     * This method allow user to show multiple same alert messages
     *
     * @param title Title that need to show
     * @param msg Message that need to show
     * @param activity
     */
    void showAlertMessage(@Nullable String title, String msg, FragmentActivity activity);

    /**
     * This method does not allow user to show multiple same alert messages
     *
     * @param title Title that need to show
     * @param msg Message that need to show
     * @param activity
     */
    void showAlertMessageWithoutDuplicates(@Nullable String title, String msg, FragmentActivity activity);

    /**
     * Verify if there is already a similar message currently displayed to the user. Returns true if a similar message is already showing, else returns false
     *
     * @param message The message that we want to compare with the currently displayed alert messages
     * @return
     */
    boolean isMessageDisplayed(@Nonnull String message);

}
    @Config(constants = BuildConfig.class, sdk = TestConfig.SDK)
@RunWith(RobolectricTestRunner.class)
public class AlertManagerImplTest {
    @Inject
    AlertManager alertManager;
    @Inject
    Context mContext;
    MainActivity mainActivity;

    @Module(
            includes = TestAppModule.class,
            injects = AlertManagerImplTest.class,
            overrides = true
    )
    static class TestModule {
    }

    @Before
    public void setUp() {
        mContext = RuntimeEnvironment.application;
        FirebaseApp.initializeApp(mContext);
        Services.initialize(new AlertManagerImplTest.TestModule()).inject(this);
        mainActivity = Robolectric.buildActivity(MainActivity.class).create().get();
    }

    @Test
    public void checkMessageDisplayed_WhenSameMessage_ShouldReturnTrue() throws Exception {
        alertManager.showAlertMessage("Title1", "Message1", mainActivity);
        Assert.assertTrue(alertManager.isMessageDisplayed("Message1"));
    }

    @Test
    public void checkMessageDisplayed_WhenDifferentMessage_ShouldReturnFalse() throws Exception {
        alertManager.showAlertMessage("Title1", "Message1", mainActivity);
        Assert.assertFalse(alertManager.isMessageDisplayed("Message2"));
    }
}