【问题标题】:Mock the onCreate of an activity when initialized with Espresso ActivityTestRule without using Dagger在不使用 Dagger 的情况下使用 Espresso ActivityTestRule 初始化时模拟活动的 onCreate
【发布时间】:2018-04-19 07:26:13
【问题描述】:

我尝试使用 espresso 初始化我的活动并模拟 onCreate,但没有在我的项目中添加 Dagger 时没有找到好的解决方案:

@Rule
public ActivityTestRule<MyActivity> mActivityRule = new ActivityTestRule<>(MyActivity.class);

我也尝试创建自定义规则,但这并没有帮助,因为我无法在活动创建之前模拟活动... 只是在创建之后,但是当时的onCreate已经被调用了。

public class MyCustomRule<A extends MyActivity> extends ActivityTestRule<A> { ....
  @Override
  protected void beforeActivityLaunched(){super.beforeActivityLaunched();}
  @Override
  protected Intent getActivityIntent() {...}
  @Override
  protected void afterActivityLaunched() {...}
  @Override
  protected void afterActivityFinished() {...}
}

【问题讨论】:

    标签: java android dagger android-espresso


    【解决方案1】:

    我使用SingleActivityFactory找到了解决问题的方法:

    private SingleActivityFactory<MyActivity> injectedFactory = new SingleActivityFactory<MyActivity>(MyActivity.class) {
     @Override
     protected MyActivity create(Intent intent) {
        MyActivity activity = new MockMyActivity();
        return activity;
     }
    };
    

    并使用它来创建规则

    @Rule
    public ActivityTestRule<MyActivity> mActivityRule = new ActivityTestRule<>(injectedFactory, false, true);
    

    你的 MockMyActivity.class 看起来像这样:

    public class MockMyActivity extends MyActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {  
          super.onCreate(savedInstanceState);
          // you can add some of your logic here
        }
    
        @Override
        protected MyFragment findOrCreateViewFragment() {
          MyFragment myFragment = (MyFragment) getSupportFragmentManager().findFragmentById(R.id.contentFrame);
          if (myFragment == null) {
             //spy-mock your fragment
             myFragment = spy(new MyFragment());
             // ex do not load data from the web service
             doNothing().when(myFragment).callLoadMyService();
    
            ActivityUtils.addFragmentToActivity(getSupportFragmentManager(), myFragment, R.id.contentFrame);
          }
          return myFragment;
    }
    

    【讨论】:

    • 太棒了!我正在寻找一种方法来启动一个显然没有在应用程序清单中声明的​​模拟 Activity,而你的方法是这样做的唯一方法(看起来如此)。我想知道为什么你没有得到更多的支持。
    猜你喜欢
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多