【问题标题】:DaggerMock not injecting Mock objects in Espresso testDaggerMock 没有在 Espresso 测试中注入 Mock 对象
【发布时间】:2017-05-13 12:33:52
【问题描述】:

尝试在我的 Espresso 测试中运行 DaggerMock 的实现未成功。我几乎完全复制了示例,但它始终使用MainPresenter 的真实实现,而不是模拟实现。

EspressoRule(完全复制自 real world sample):

public class EspressoDaggerMockRule extends DaggerMockRule<AppComponent>
{
    public EspressoDaggerMockRule()
    {
        super(AppComponent.class, new AppModule(getApp()));
        set(new ComponentSetter<AppComponent>()
        {
            @Override
            public void setComponent(AppComponent appComponent)
            {
                getApp().setComponent(appComponent);
            }
        });
    }

    private static App getApp()
    {
        return (App) InstrumentationRegistry.getInstrumentation().getTargetContext().getApplicationContext();
    }
}

浓缩咖啡测试:

public class MainActivityTest
{
    @Rule
    public EspressoDaggerMockRule rule = new EspressoDaggerMockRule();

    @Rule
    public ActivityTestRule<MainActivity> mActivityTestRule = new ActivityTestRule<>(MainActivity.class, false, false);

    @Mock MainPresenter presenter;

    @Test
    public void test() throws InterruptedException
    {
        final MainActivity activity = mActivityTestRule.launchActivity(null);
        // presenter in this test class will be mocked but the presenter in activity will be real

        Thread.sleep(1000);
    }
}

主活动:

public class MainActivity extends BaseActivity implements MainContract.View
{
    @Inject MainPresenter mainPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public void setupComponent(AppComponent appComponent)
    {
        appComponent
                .mainActivityComponentBuilder()
                .mainActivityModule(new MainModule(this))
                .build()
                .inject(this);
    }
}

主组件:

@Subcomponent(modules = {MainModule.class})
public interface MainComponent
{
    void inject(MainActivity mainActivity);

    @Subcomponent.Builder
    interface Builder
    {
        Builder mainActivityModule(MainModule module);

        MainComponent build();
    }
}

主模块:

@Module
public class MainModule
{
    private MainActivity mainActivity;

    public MainModule(MainActivity mainActivity)
    {
        this.mainActivity = mainActivity;
    }

    @Provides
    public MainContract.View mainView()
    {
        return mainActivity;
    }

    @Provides
    public MainPresenter mainPresenter()
    {
        return new MainPresenter(mainActivity);
    }
}

应用组件

@Singleton
@Component(modules = {AppModule.class})
public interface AppComponent
{
    MainComponent.Builder mainActivityComponentBuilder();
}

应用:

public class App extends Application
{
    public static AppComponent appComponent;

    @Override
    public void onCreate()
    {
        super.onCreate();
        setupGraph();
    }

    private void setupGraph()
    {
        appComponent = DaggerAppComponent.builder()
                .appModule(new AppModule(this))
                .build();
    }

    @VisibleForTesting(otherwise = VisibleForTesting.NONE)
    public void setComponent(AppComponent component)
    {
        appComponent = component;
    }
}

示例运行良好。我错过了什么吗?

我已经上传了我在这里尝试的全部源代码:https://github.com/jbmlaird/DaggerMockRepository

【问题讨论】:

    标签: android unit-testing dagger-2


    【解决方案1】:

    此问题已在 0.6.5 版中修复

    【讨论】:

      猜你喜欢
      • 2015-02-17
      • 1970-01-01
      • 2017-11-13
      • 2014-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      相关资源
      最近更新 更多