2016-09-21 95 views
3

嗨,我有一个以下问题。我想为用户界面编写带有浓缩咖啡的android测试,并且为了让测试不是片状,我想模拟我的演示者。Android测试与匕首模拟注入构造函数

我在应用程序中使用匕首。我的配置是如下:

@Singleton 
@Component(modules = AppModule.class) 
public interface AppComponent { 
    //some injections 
    //some providings 
} 

我有一个模块组件

@Module 
public class AppModule { 
    //providings for component 
} 

然后我也有一个活动的一个组成部分用于模块组件

@PerActivity 
@Component(dependencies = AppComponent.class, modules = ActivityModule.class) 
public interface ActivityComponent { 
    //inject activites 
    //provide subcomponents for activites 
} 

然后我有我的网页子组件

@PerActivity 
@Subcomponent(modules = InfoModule.class) 
public interface InfoComponent { 
    void inject(DetailActivity activity); 
} 

和用于子

@Module 
public class InfoModule { 

    @Provides 
    public DetailPresenter provideDetailPresenter(ShowDetailsUseCase showDetailsUseCase, 
             OtherUseCase getPoisUseCase, 
             AccountManager accountManager, Navigator 
               navigator) { 
     return new DetailPresenter(showDetailsUseCase, otherUseCase, accountManager, navigator); 
    } 
} 

,然后将详细活动注入一个模块的DetailPresenter

public class DetailActivity extends BaseActivity { 

    @Inject 
    DetailPresenter mPresenter; 

    InfoComponent mComponent; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mComponent = getActivityComponent().provideInfoModule(new InfoModule()); 
     mComponent.inject(this); 
     mPresenter.bindView(this); 
     mPresenter.onCreate(new PresenterBundle(getIntent().getExtras(), savedInstanceState)); 
    } 
    //functionality of detailActiviy 
} 

然后我有其使用构造器注入

public class DetailPresenter extends BasePresenter { 


    private ShowDetailsUseCase mDetailsUseCase; 
    private final OtherUseCase getPoisUseCase; 

    private AccountManager accountManager; 
    private Navigator navigator; 

    @Inject 
    public DetailPresenter(ShowDetailsUseCase getDetailsUseCase, OtherUseCase getPoisUseCase, 
    AccountManager 
    accountManager, Navigator navigator) { 
     this.mDetailsUseCase = getDetailsUseCase; 
     this.getPoisUseCase = gotherUseCase; 
     this.accountManager = accountManager; 
     this.navigator = navigator; 
    } 

    @Override 
    public void onCreate(@Nullable PresenterBundle bundle) { 
     super.onCreate(bundle); 
     //other things to do on initialization 
     ((DetailView) getView()).showDetails(getDetailsFromUseCase()); 

    } 
} 

现在,在测试演示我想模仿主持人:

@RunWith(AndroidJUnit4.class) 
public class DetailActivityTest { 

    @Rule 
    public final ActivityTestRule<DetailActivity> main = new ActivityTestRule<DetailActivity>(DetailActivity.class, true, false); 

    @Rule 
    public final DaggerMockRule<AppComponent> rule=new EspressoDaggerMockRule(); 

    @Mock 
    DetailPresenter presenter; //does not work because @Inject constructor 


    @Test 
    public void locationTest() { 

     Details details = generateDetails(); 

     launchActivity(); 

     doAnswer(answer -> { 
        activity.showDetails(details); 
        return null; 
       } 

     ).when(presenter).onCreate(any()); 

     //espresso verify afterwards 
    } 
} 

,但如果我试图嘲弄以下错误显示:

java.lang.RuntimeException: Error while trying to override objects: 
a.b.c.ui.mvp.presenter.DetailPresenter 
You must define overridden objects using a @Provides annotated method instead of using @Inject annotation 

是否有人有一个想法如何,我可以嘲笑主持人甚至@Inject构造函数和依赖。 我不想嘲笑数据层,因为那时我必须模拟数据库,apiClient,cacheData等等。而且一些数据层也有注入依赖,所以我也不能嘲笑它们。

预先感谢您

回答

1

DetailPresenter类是在InfoModule创建的,所以你不需要Inject注解。你得到的错误是因为使用DaggerMock你只能替换模块中创建的对象。在您的示例中,您已经在模块中创建它,您只需要删除Inject注释。

+0

我得到同样的错误,我试着去除注入,但仍然得到相同的错误。什么可以是其他原因,我们是否也需要为每个活动模块创建规则,像这样规则 public final DaggerMockRule rule = new EspressoDaggerMockRule();或仅用于应用程序组件 –