测试 Android 深度链接导航到活动的最佳实践

Best practise for testing Android Deep Links navigation into activities

我有一个 activity 用于保存片段。我创建这个是为了能够 运行 深入 Link 个人资料。我还传递 PROFILE_ID 作为查询参数。所以整个深度 link 看起来是这样的:“tigranes://home/profile?profileId=3545664”。

class ProfileActivity : BaseActivity() {

    companion object {
        @JvmStatic
        fun newInstance(context: Context, profileId: String): Intent {
            val intent = Intent(context, ProfileActivity::class.java)
            intent.putExtra(ProfileFragment.PROFILE_ID, profileId)
            return intent
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)

        val profileId: String = intent.getStringExtra(ProfileFragment.PROFILE_ID)
        val transaction = supportFragmentManager.beginTransaction()
        val fragment = ProfileFragment.newInstance(profileId)
        transaction.add(R.id.fragment_container, fragment)
        transaction.commit()
    }
}

所以我的问题是,如果这个深度 link 正在打开 ProfileActivity,那么编写测试检查的最佳策略是什么。我尝试使用 ActivityTestRule,但找不到向其传递参数的方法。

方法newInstance()似乎完全是胡说八道,因为Intent被传递给了Activity;您应该重新考虑 ProfileActivity 的构建方式,因为这不是它的工作方式。 getIntent() 是获得 Intent 所需的全部内容(正如该方法的名称所暗示的那样)。还应考虑@EpicPandaForce 的建议,以免造成混乱。然而,这不是真正的问题(只是说说,因为你可能会声称 "it doesn't work")。


用深度 link Intent 测试 Activity 的工作原理与此类似:

import android.content.Intent
import android.net.Uri
import androidx.test.ext.junit.rules.activityScenarioRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.Rule
import org.junit.runner.RunWith

@RunWith(AndroidJUnit4::class)
class ProfileActivityTest {

    @get:Rule
    var testRule = activityScenarioRule<ProfileActivity>(
        Intent(Intent.ACTION_VIEW, Uri.parse(DEEP_LINK))
    )

    @Test
    ...

    companion object {
        val DEEP_LINK = "tigranes://home/profile?profileId=3545664"
    }
}

activityScenarioRule 取决于:

androidTestImplementation "androidx.test.ext:junit-ktx:1.1.1"

请告诉我这是否有效(这需要首先修复 ProfileActivity)。

还要确保 AndroidManifest.xml 中的 intent-filter 设置正确。