在 Robolectric 测试中注入模拟

Injecting mocks in a Robolectric test

我必须为具有私有字段(演示者)的特定 Activity 构建一个 Robolectric 测试。为了将模拟注入该字段,我使用了反射,因为我正在处理的项目没有依赖注入框架。

我的测试设置如下:

MyActivityTest.java

public class ConsumoViewTest {

@Mock
MvpConsumo.Presenter mockPresenter;

private MyActivity view;

@Before
public void setUp() {
    MockitoAnnotations.initMocks(this);
    ActivityController<MyActivity> activityController =
        Robolectric.buildActivity(MyActivity.class);
    view = activityController.get();
    try {
        FieldUtils.writeField(view, "presenter", mockPresenter, true);
    } catch (IllegalAccessException e){
        //Exception handling
    }
    activityController.setup();
}

作为我的 Activity 设置的一部分,它创建并添加了一个 Fragment,在 OnAttach() 期间,Fragment 为演示者调用 getter。现在,我无法理解的是 Activity returns 是一个真正的演示者,而不是我注入的模拟。这个真实的演示者最终调用了我的真实模型和我的真实网络服务,这显然不适合测试。

现在有人知道为什么我的模拟在这种情况下被忽略了吗?

写完问题我才明白问题出在哪里。我的反射确实有效,并且演示者被初始化为 Mock,但我忘记了在 Activity.OnCreate() 期间演示者被初始化为真正的演示者,从而覆盖了我之前注入的 Mock。