android 在onCreate()中运行待测代码时,如何使用空闲资源?

wfsdck30  于 2023-01-24  发布在  Android
关注(0)|答案(1)|浏览(97)

我尝试在tutorial之后的测试中使用空闲资源。
问题是要测试的代码已经在onCreate()方法中运行。
在这个(旧的)question中,建议在@Before注解方法中注册空闲资源,但这并不能解决问题,因为我们仍然需要Activity的示例来进行注册:

private ActivityScenario<MyActivity> scenario;
private IdlingResource myIdlingResource;

@Before
public void setUp() {
    scenario = ActivityScenario.launch(MyActivity.class); // all the code in onCreate() (and also onStart() and onResume()) will run now and idling resource will be null
    scenario.onActivity(activity -> { 
        // now we have a reference to the activity under test but it is already too late; 
        // this method can not be called before the activity is launched
        myIdlingResource= activity.getIdlingResource();
        IdlingRegistry.getInstance().register(myIdlingResource);
    });
}

@Test
public void test() {
    // assert stuff that happens when activity is created
}

在这种情况下如何使用空闲资源?

vlurs2pr

vlurs2pr1#

问题是,被测活动和测试活动都需要使用相同的空闲资源。
我最终提出了一个使用依赖项注入的解决方案,因为我已经在项目中使用了Dagger,并且还使用它来注入模拟依赖项以用于测试目的。
我在测试模块中注入了一个真实的的空闲资源:

@Module
public class MyMockModule {

   @Provides
   @Singleton
   CountingIdlingResource myIdlingResource(){
      return new CountingIdlingResource("MyIdleStuff");
   }
}

我为生产代码注入了一个空的空闲资源,以确保空闲资源代码不会在生产中被调用(最好是有一个IdlingResource的自定义实现,它什么也不做):

@Module
public class MyModule {

   @Provides
   @Nullable
   @Singleton
   CountingIdlingResource myIdlingResource(){
      return null;
   }
}

为了使测试工作而必须添加生产代码,并且在生产中使用模拟,在测试中使用真实的实现,这仍然感觉有点奇怪,但至少这使我的测试工作(而不必诉诸像Thread.sleep()这样的激烈手段......

相关问题