在运行任何UI测试android之前,清除共享的pref数据



在屏幕中运行任何测试之前,我想清除SharedPreferences。我正在使用下面的代码来实现这一点,但它不起作用。

@RunWith(AndroidJUnit4::class)
class HomePage{
private lateinit var activityScenario: ActivityScenario<HomeActivity>
@Before
fun setUp() {
IdlingRegistry.getInstance().register(EspressoIdlingResource.countingIdlingResource)
activityScenario = ActivityScenario.launch(HomeActivity::class.java)
InstrumentationRegistry.getInstrumentation().targetContext.clearSharedPrefs() 
}
@Test
fun testConditionA(){
//Do something
}
@Test
fun testConditionB(){
//Do something
}
}

清除SharedPreferences的代码

fun Context.clearSharedPrefs() =
this.getSharedPreferences("name", Context.MODE_PRIVATE).edit().clear().commit()

以下是我已经通过的文章

链接

更新

如果我把Thread.sleep()放在InstrumentationRegistry.getInstrumentation().targetContext.clearSharedPrefs()之后,它就起作用了。我该如何避免这种情况,或者有更好的方法吗?

您的问题可能是apply,因为apply方法是异步的,所以当您开始下一次测试时,apply方法可能仍然不起作用,所以我建议您尝试使用commit

fun Context.clearSharedPrefs() =
this.getSharedPreferences("name", Context.MODE_PRIVATE).edit().clear().commit()

编辑:我的示例

@RunWith(AndroidJUnit4::class)
class HomePage{
private lateinit var activityScenario: ActivityScenario<MainActivity>
@Before
fun setUp() {
val context = InstrumentationRegistry.getInstrumentation().targetContext;
context.getSharedPreferences("name", Context.MODE_PRIVATE).edit().clear().commit()
}
@Test
fun testConditionA(){
val context = InstrumentationRegistry.getInstrumentation().targetContext;
context.getSharedPreferences("name", Context.MODE_PRIVATE).edit().putBoolean("asd", true).commit()
val a = context.getSharedPreferences("name", Context.MODE_PRIVATE).getBoolean("asd", false)
Assert.assertEquals(a, true)
}
@Test
fun testConditionB(){
val context = InstrumentationRegistry.getInstrumentation().targetContext;
val a = context.getSharedPreferences("name", Context.MODE_PRIVATE).getBoolean("asd", false);
Assert.assertEquals(a, false)
}

}

我刚刚用一个简单的计数器应用程序和一个文本视图测试了这一点,该视图显示了敲击屏幕几次后的计数。

以下是我使用ActivityScenarioContext类上的扩展函数进行设置的结果,因为您也设置了

@RunWith(AndroidJUnit4::class)
class AppTest {
private lateinit var  activityScenario: ActivityScenario<HomeActivity>
@Before
fun setup() {
activityScenario = ActivityScenario.launch(MainActivity::class.java)
activityScenario.moveToState(Lifecycle.State.RESUMED)
InstrumentationRegistry.getInstrumentation().targetContext.clearSharedPrefs()
}
@After
fun tearDown(){
activityScenario.moveToState(Lifecycle.State.DESTROYED)
}
@Test
fun testConditionA(){
//Do something
}
@Test
fun testConditionB(){
//Do something
}
}

当您启动活动并将其移动到视图位于屏幕上的恢复状态时,您可以清除首选项。测试运行后,将"活动"状态移动到已销毁状态,从而结束"活动"。

根据文件:

ActivityScenation不会自动清除设备状态,并且可能会在测试完成后让活动继续运行。

在不使用Thread.sleep的情况下清除应用程序偏好的另一种方法是设置测试规则:

class MyActivityTestRule : ActivityTestRule<MyActivity>(MyActivity::class.java, false, true) {
val preferences = ApplicationProvider.getApplicationContext<Application>()
.getSharedPreferences(NAME, MODE)
override fun beforeActivityLaunched() {
preferences.edit().clear().commit()
// or ApplicationProvider.getApplicationContext<Application>().clearSharedPrefs()
}
}

这样可以确保应用程序在启动活动之前清除其首选项。只需将规则添加到您的测试中:

class HomePage {
@get:Rule val myTestRule = MyActivityTestRule()
// ...
}

最新更新