久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

Android 為 Espresso 測試模擬 Dagger2 注入依賴項

Android Mocking a Dagger2 injected dependency for a Espresso test(Android 為 Espresso 測試模擬 Dagger2 注入依賴項)
本文介紹了Android 為 Espresso 測試模擬 Dagger2 注入依賴項的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我有一個嚴重依賴注入的 (dagger2) 應用程序.我想運行 espresso 測試,而無需讓測試瀏覽整個應用程序,然后登錄到應用程序.

I have a heavily dependency injected (dagger2) application. I would like to run an espresso test without having the test navigate through the whole application, and log into the application.

我想開始我的遠程活動,并模擬登錄管理器.然而,在任何@test 函數中,我們已經在調用onCreate 時命中了空指針.如果我在啟動活動(如下所示)之前覆蓋它,則活動為空.

I would like to start on my teleActivity, and mock the login manager. However in any @test function, we have already hit the null pointer as we have called onCreate. If I override it before we launch the activity (show below) the activity is null.

據我了解,切換下劃線依賴項的能力是我們使用 Dagger2 的一個重要原因,否則它將只是一個過度設計的單例.如何覆蓋、模擬或切換到測試匕首模塊的注入 - 這樣我就可以創建這個簡單的 espresso 測試.

To my understanding, the ability to switch our underlining dependencies is a large reason why we use Dagger2, else it would be just a very over engineered singleton. How do I override, mock, or switch the injection to a testing dagger module -- so I can create this simple espresso test.

請注意,如果有影響的話,我也在 MVP 設計模式中編寫了所有這些內容.

Note I also wrote all this in the MVP design pattern if that makes a difference.

遠程活動

@Inject
TelePresenter mTelePresenter;
@Inject
public LoginStateManager mLoginStateManager;

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ButterKnife.bind(this);
    DaggerInjectorTele.get().inject(this);
    mTelePresenter.setTeleDependencies(this);
    Intent intent = getIntent();

    String searchId = null;

    if (intent != null) {
        searchId = intent.getStringExtra(Constants.SEARCH_ID);
       }

    mTelePresenter.onCreateEvent(searchId,
            Helper.makeAuthorizationHeader(
            // CRASH Null pointer
            mLoginStateManager.getBaseLoginResponse().getAccessToken()));

}

濃縮咖啡

@LargeTest
@RunWith(AndroidJUnit4.class)
public class TeleTest {
    @Rule
    public ActivityTestRule<TeleActivity> mActivityTestRule = new ActivityTestRule(
            TeleActivity.class) {
        @Override
        protected void beforeActivityLaunched() {
            super.beforeActivityLaunched();
            TeleActivity teleActivity = (TeleActivity)getActivity();
             //teleActivity NULL!
            teleActivity.mLoginStateManager = mock(LoginStateManager.class);
            LoginResponse loginResponse = mock(LoginResponse.class);
            when(loginResponse.getAccessToken()).thenReturn("1234");
            // Nope here still null


when(teleActivity.mLoginStateManager.getBaseLoginResponse()).thenReturn(loginResponse);

        }
    };

匕首注射器

  public class DaggerInjectorTele {
    private static TelePresenterComponent telePresenterComponent =
            DaggerTelePresenterComponent.builder().build();

    public static TelePresenterComponent get() {
        return telePresenterComponent;
    }
}

TelePresenter組件

TelePresenterComponent

@Singleton
@Component(modules = {TelePresenterModule.class,
        LoginStateManagerModule.class})
public interface TelePresenterComponent {
    void inject(TeleActivity activity);
}

TelePresenter 模塊

TelePresenterModule

@Module
public class TelePresenterModule {

    @Provides
    @Singleton
    public TelePresenter getTelePresenter() {
        return new TelePresenter();
    }
}

LoginStateManager 模塊

LoginStateManagerModule

@Module
public class LoginStateManagerModule {

    @Provides
    @Singleton
    public LoginStateManager getLoginStateManager(){
        return new LoginStateManager();
    }
}

推薦答案

首先,您決定使用依賴注入 (Dagger2) 是一個非常好的決定,并且確實會讓您的測試更容易編寫.

First, your decision to use dependency injection (Dagger2) is a very good one and will indeed make your tests easier to write.

您必須覆蓋依賴注入配置(模塊)并注入一個模擬.下面是一個簡單的例子來說明如何做到這一點.

You have to override dependency injection configuration (module) and inject a mock. Here is a simple example of how it can be done.

首先你需要一個模擬:

LoginStateManager lsmMock = mock(LoginStateManager.class);

現在覆蓋 DI 配置以使用此模擬:

Now override the DI config to use this mock:

//Extend your TelePresenterModule, override provider method
public class TestTelePresenterModule extends TelePresenterModule{
    @Override
    public LoginStateManager getLoginStateManager() {
        //simply return the mock here
        return lsmMock;
    }
}

現在開始測試:

@Test
//this is an espresso test
public void withAMock() {
    //build a new Dagger2 component using the test override
    TelePresenterComponent componentWithOverride = DaggerTelePresenterComponent.builder()
            //mind the Test in the class name, see a class above
            .telePresenterModule(new TestTelePresenterModule())
            .build();

    //now we initialize the dependency injector with this new config
    DaggerInjectorTele.set(componentWithOverride);

    mActivityRule.launchActivity(null);

    //verify that injected mock was interacted with
    verify(lsmMock).whatever();
}

示例來自:https://github.com/yuriykulikov/DIComparison/blob/master/app/src/androidTest/java/com/example/yuriy/dependencyinjectioncomparison/Dagger2Test.java

這篇關于Android 為 Espresso 測試模擬 Dagger2 注入依賴項的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

EditText: Disable Paste/Replace menu pop-up on Text Selection Handler click event(EditText:禁用文本選擇處理程序單擊事件上的粘貼/替換菜單彈出)
Multiline EditText with Done SoftInput Action Label on 2.3(2.3 上帶有完成 SoftInput 操作標簽的多行 EditText)
How to detect the swipe left or Right in Android?(如何在 Android 中檢測向左或向右滑動?)
Prevent dialog dismissal on screen rotation in Android(防止在Android中的屏幕旋轉對話框解除)
How do I handle ImeOptions#39; done button click?(如何處理 ImeOptions 的完成按鈕點擊?)
How do you set EditText to only accept numeric values in Android?(您如何將 EditText 設置為僅接受 Android 中的數值?)
主站蜘蛛池模板: 特级黄色毛片 | 色综久久 | 91麻豆蜜桃一区二区三区 | 成人在线免费视频观看 | 久久人人爽人人爽 | 麻豆亚洲| 亚洲电影免费 | 91精品国产综合久久久久久丝袜 | 狠狠ri | 成在线人视频免费视频 | 日本免费网 | 亚洲a毛片| 久久久www成人免费精品张筱雨 | 成人精品一区二区三区 | 久久久久一区二区三区四区 | 欧美日韩视频一区二区 | 日本一区二区三区视频在线 | 中文字幕91av | 精品久久久久久亚洲综合网站 | h视频在线观看免费 | 91av在线看| 日本欧美大片 | 中文字幕在线一区二区三区 | 黄片毛片免费看 | 男人天堂99 | 欧美黄视频 | 6080yy精品一区二区三区 | 久久看精品 | 中文字幕第90页 | 日日干日日操 | 狠狠久久| 中文字幕日韩欧美一区二区三区 | 久久精品视频播放 | 男女网站免费 | 激情欧美日韩一区二区 | 日韩美女爱爱 | 美女高潮网站 | 手机看片1 | 国产二区在线播放 | 熟女毛片 | 国产日韩欧美一区二区在线播放 |