Android Интеграционный тест: как смоделировать ClipData намерения onActivityResult, используя намерение Expresso - PullRequest
1 голос
/ 10 марта 2020

Я разрабатываю приложение Android с использованием Kotlin. Я пишу интеграционные тесты для моего приложения, используя платформу Expresso. Теперь я пытаюсь смоделировать ClipData намерения обратного вызова onActivityResult. Я высмеиваю намерение, используя экспресс-намерение платформы Expresso.

Ниже приведена реализация моего метода обратного вызова onActivityResult.

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        Log.i(TAG, "Start handleGalleryActivityResult")
        if (data?.clipData?.itemCount == null) {
            return
        }

        if (data?.clipData?.itemCount as Int > 0) {
            Log.i(TAG, "handleGalleryActivityResult: clipData count is greater than zero")
            for (i in 0 until data?.clipData?.itemCount as Int) {
                Log.i(TAG, "Processing index ${i}")
                if (data?.clipData?.getItemAt(i)?.uri != null) {
                    val file: File = File(data?.clipData?.getItemAt(i)?.uri?.path)
                    Log.i(TAG, "Picked gallery file ${data?.clipData?.getItemAt(i)?.uri?.path}")
                } else {
                    Log.i(TAG, "Picked gallery file at index ${i} is null")
                }
            }
        }
    }

Как видно из метода обратного вызова onActivityResult, Я получаю clipData для намерения.

Я пишу тест, имитирующий возвращенное намерение, следующим образом.

@Test fun filesAreUploadedToServerWhenPickedUpFromGallery() {
        this.launchActivityWithIntent()
        val resultData = Intent()
        val result = Instrumentation.ActivityResult(Activity.RESULT_OK, resultData)
        intending(IntentMatchers.hasAction(Intent.ACTION_PICK)).respondWith(result)
        onView(withId(R.id.camera_image_btn_gallery)).perform(click())

        //the rest of the code goes here
    }

Как вы можете видеть в моем коде, я высмеиваю намерение быть возвращен вот так.

intending(IntentMatchers.hasAction(Intent.ACTION_PICK)).respondWith(result)

Мой вопрос: как я могу передать данные клипа в целях насмешки над этим?

1 Ответ

1 голос
/ 10 марта 2020

Создать объект ClipData как

  1. Создать ClipDescription и ClipData.Item объект

    val clipDescription = ClipDescription("Dummy", arrayOf(ClipDescription.MIMETYPE_TEXT_PLAIN))
    
    val uri = Uri.parse("http://www.google.com");
    
    val clipItem = ClipData.Item(uri)
    
  2. Создать ClipData объект и установите его для объекта намерения как:

    val _clipData = ClipData(clipDescription, clipItem)
    
    resultData.clipData = _clipData
    

Вы можете добавить больше элементов, используя addItem как _clipData.addItem(clipItem). Вы можете использовать другие конструкторы и метод классов ClipDescription и ClipData.Item для добавления дополнительных данных.

Альтернативно, вы можете создавать фактические объекты-макеты и макетировать соответствующие методы для тех же используемых объектов, что и в вашей модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...