Java 在机器人分子测试中注入模拟

Java 在机器人分子测试中注入模拟,java,android,unit-testing,robolectric,Java,Android,Unit Testing,Robolectric,我必须为特定的活动构建一个具有私有字段(演示者)的机器人分子测试。为了向该字段中注入模拟,我使用了反射,因为我正在处理的项目没有依赖注入框架 我的测试设置如下: MyActivityTest.java public class ConsumoViewTest { @Mock MvpConsumo.Presenter mockPresenter; private MyActivity view; @Before public void setUp() { MockitoAnnotat

我必须为特定的
活动
构建一个具有私有字段(演示者)的机器人分子测试。为了向该字段中注入模拟,我使用了反射,因为我正在处理的项目没有依赖注入框架

我的测试设置如下:

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();
}
公共类消费测试{
@嘲弄
MvpConsumo.Presenter-mockPresenter;
私人活动视图;
@以前
公共作废设置(){
initMocks(this);
活动控制器活动控制器=
构建活动(MyActivity.class);
view=activityController.get();
试一试{
writeField(视图,“presenter”,mockPresenter,true);
}捕获(非法访问例外e){
//异常处理
}
activityController.setup();
}
作为我的
活动
设置的一部分,它在
OnAttach()期间创建并添加一个
片段
片段
调用演示者的getter。现在,我不明白的是,
活动
返回一个真实的演示者,而不是我注入的模拟。这个真实的演示者最终调用了我的真实模型和我的真实Web服务,这显然不适合测试


现在有人知道为什么在这个场景中忽略了我的模拟吗?

在写了这个问题后,我意识到问题是什么。我的反射确实起作用,演示者被初始化为模拟,但我在
活动期间忘记了这一点。OnCreate()
演示者被初始化为真实的演示者,从而覆盖了我之前注入的模拟。

很好,你找到了答案。为什么要使用反射来注入演示者?由于项目限制,我不能包括Dagger2或其他DI框架。使用反射来测试私有字段是不好的,但我不认为这会导致仅为测试而使用
setPresenter
方法会更好,不需要DI框架。当您无法控制生命周期时,这种方法会出现问题。在测试过程中,当我使用Roboelectric进行测试时,您不能总是在
之前停止注入依赖项的过程,所以我可以控制生命周期测试期间的活动性。话虽如此,我还是很好奇,您认为注入演示者的更好方法是什么?我的意思是,您仍然不能拆分
onCreate()
或正在测试的类的任何其他方法。因此,如果您需要控制注入内容的确切位置,那么您的方法将无法工作