如何正确窥探活动

Tho*_*ler 28 android mockito

当一些东西被监视时,Mockito会创建一个代理实例.现在,有没有办法将在该代理实例上执行的setter转发到它后面的真实实例?

理由:我有一个我完全没有控制的对象实例,即Android活动.我可以给我的应用程序的大部分地区代理的版本和运行正常的是,因为我需要在活动的创建阶段很早就创建间谍/代理,目前尚不能完全实例化,例如基地上下文没附着.这发生在代理实例上,当然不被活动实例本身使用(它通过引用自身Activity.this).最终的结果是,这会导致各种崩溃,因为资源解析是通过这个基础上下文发生的,因此内部Fragment机制会抛出NPE等等.

这是一些代码:

public class CustomAndroidJUnitRunner extends AndroidJUnitRunner {
    @Override
    public Activity newActivity(ClassLoader cl, String className, Intent intent)
            throws InstantiationException, IllegalAccessException, ClassNotFoundException {
        Activity activity = super.newActivity(cl, className, intent);
        return maybeStubSomeDelegate(activity);
    }

    private Activity maybeStubSomeDelegate(Activity activity) {
        if (!(activity instanceof SomeDelegate)) {
            return activity;
        }
        Activity spiedActivity = spy(activity);
        doReturn(SomeDelegateMock.getInstance())
            .when((SomeDelegate) spiedActivity)
            .getDelegate();
        return spiedActivity;
    }
}
Run Code Online (Sandbox Code Playgroud)

我很无能为力 - 任何想法?

小智 3

使用:

android 测试支持库的 SingleActivityFactoryActivityTestRule 和 Mockito 的 间谍()

dependencies {
  androidTestImplementation 'com.android.support.test:runner:1.0.2'
  androidTestImplementation 'com.android.support.test:rules:1.0.2'
  androidTestImplementation 'org.mockito:mockito-android:2.21.0'
}
Run Code Online (Sandbox Code Playgroud)

大纲:

将间谍实例注入 SingleActivityFactory 的实现中

代码:

public class MainActivityTest {
    MainActivity subject;

    SingleActivityFactory<MainActivity> activityFactory = new SingleActivityFactory<MainActivity>(MainActivity.class) {
        @Override
        protected MainActivity create(Intent intent) {
            subject = spy(getActivityClassToIntercept());
            return subject;
        }
    };

    @Rule
    public ActivityTestRule<MainActivity> testRule = new ActivityTestRule<>(activityFactory, true, true);

    @Test
    public void activity_isBeingSpied() {
        verify(subject).setContentView(R.layout.activity_main);
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 不,现在 ActivityTestRule 已被弃用,并且官方 android 测试库似乎没有提供类似的功能来从工厂创建一个您可以监视的活动。文档建议使用 ActivityScenario 或 ActivityScenarioRule,但我尚未找到使用其中任何一个来监视活动的方法。 (3认同)