在屏幕中运行任何测试之前,我想清除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)
}
}
我刚刚用一个简单的计数器应用程序和一个文本视图测试了这一点,该视图显示了敲击屏幕几次后的计数。
以下是我使用ActivityScenario
和Context
类上的扩展函数进行设置的结果,因为您也设置了
@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()
// ...
}