【问题标题】:Android Mockito Test on Activity's method which shows alert dialogAndroid Mockito 测试显示警报对话框的 Activity 方法
【发布时间】:2021-06-29 15:35:26
【问题描述】:

我是 Mockito Android 测试框架的新手。我在活动中编写了一种方法,它显示了 AlertDialog,我正在为该方法编写测试用例。

以下是显示警报对话框的活动的功能:

fun showDialogBox(
         shortMessage: String?,
         longMessage: String?,
         progress: Int,
         status: String?
     ) {
         runOnUiThread {

             if (cdfwExtractionStatusAlertDialog == null) {

                 val mDialogView = LayoutInflater.from(this).inflate(
                     R.layout.cdfw_extraction_status_layout,
                     null
                 )

                 val mBuilder = AlertDialog.Builder(this)
                     .setView(mDialogView)
                     .setCancelable(false)

                 shortMessageTv = mDialogView.findViewById(R.id.short_message_tv)
                 longMessageTv = mDialogView.findViewById(R.id.long_message_tv)
                 closeButton = mDialogView.findViewById(R.id.close_button)
                 cdfwProcessBar = mDialogView.findViewById(R.id.progress_bar)

                 cdfwProcessBar.progress = progress

                 shortMessageTv.text = shortMessage
                 longMessageTv.text = longMessage

                 closeButton.setOnClickListener {
                     cdfwExtractionStatusAlertDialog?.dismiss()
                 }

                 checkStatus(status)
                 cdfwExtractionStatusAlertDialog = mBuilder.show()
             } else {
                 shortMessageTv.text = longMessage
                 longMessageTv.text = longMessage
                 cdfwProcessBar.progress = progress
                 checkStatus(status)
             }
         }
    }

这是我对同一功能的模拟测试用例:

@Test
    public void testCDFWExtractionStatusNoZipFound(){
        MainActivity activity = Mockito.mock(MainActivity.class);
        activity.showDialogBox("","CDFW Required.",0,"FAILED_NO_ZIP_FOUND");
        Mockito.matches("CDFW Extraction Status");
        Mockito.matches("CDFW Required.");
        Mockito.matches("Close");
    }

    @Test
    public void testCDFWExtractionStatusInProgress(){
        MainActivity activity = Mockito.mock(MainActivity.class);
        activity.showDialogBox("","CDFW extraction ongoing",0,"IN_PROGRESS");
        Mockito.matches("CDFW Extraction Status");
        Mockito.matches("CDFW extraction ongoing");
    }

它显示测试成功通过,但我不确定这是否是为同一函数编写测试用例的正确方法,如果这是错误的方法,那么我该如何为同一函数编写测试用例。

【问题讨论】:

    标签: android unit-testing kotlin mockito


    【解决方案1】:

    在测试 UI 时,最好使用仪器化测试。

    仪器测试是在物理设备上运行的测试,因此,在您的情况下,测试将在真实设备或模拟器中运行以检查流程是否正确。

    为此,您可以使用 Espresso,它是 AndroidX 提供的框架。

    更多详情,请查看: Test UI for a single app

    现在,为什么不使用 Mockito 进行 UI 测试?

    当您测试 UI 时,您必须确保正确地流向用户和良好的交互。您可以模拟该场景,但您无法测试整个流程,因为您不知道它会如何表现,例如,在与您正在测试的位置不同的地方进行点击时。

    如果你想测试你的警报对话框是否显示,你可以使用:

    @Test
    fun testCDFWExtractionStatusNoZipFound() {
        //..
        onView(withId(R.id.dialogId)).check(matches(allOf(withText("CDFW Required"), isDisplayed()));
        //..
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多