在 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。
我必须为具有私有字段(演示者)的特定 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。