2016-09-21 111 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();或僅用於應用程序組件 –