测试 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
设置正确。
我有一个 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
设置正确。