首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DaggerMock在Espresso测试中没有注入模拟对象

DaggerMock在Espresso测试中没有注入模拟对象
EN

Stack Overflow用户
提问于 2017-05-13 12:33:52
回答 1查看 401关注 0票数 0

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

EspressoRule (完全从真实世界样本复制):

代码语言:javascript
复制
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();
    }
}

浓缩咖啡试验:

代码语言:javascript
复制
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);
    }
}

MainActivity:

代码语言:javascript
复制
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);
    }
}

MainComponent:

代码语言:javascript
复制
@Subcomponent(modules = {MainModule.class})
public interface MainComponent
{
    void inject(MainActivity mainActivity);

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

        MainComponent build();
    }
}

MainModule:

代码语言:javascript
复制
@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);
    }
}

AppComponent

代码语言:javascript
复制
@Singleton
@Component(modules = {AppModule.class})
public interface AppComponent
{
    MainComponent.Builder mainActivityComponentBuilder();
}

应用程序:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-13 14:54:35

此问题已在0.6.5版中得到解决。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43953210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档