2015-12-23 56 views
1

我有一個BaseActivity,它是一個抽象活動,未在AndroidManifest中註冊。 BaseActivity將在活動的生命週期中調用getPresenter。如何測試android的抽象活動?

public abstract class BaseActivity extends AppCompatActivity{ 

    public abstract Presenter getPresenter; 
    public abstract int getLayout(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(getLayout()); 
     getPresenter().attachView(this); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     getPresenter().detachView(); 
    } 
} 

我使用ActivityTestRule來啓動BaseActivity,但會顯示以下錯誤。 java.lang.RuntimeException: Could not launch activity

如何測試getPresenter().attachView(this)getPresenter().detachView()在正確的活動生命週期中被調用?

回答

0

我沒有與Android的測試,尤其是單元測試相當大的經驗,但我已經發現了這個帖子,這可能對您有用: Is it possible to test an Abstract activity with Robolectric

而且Robolectric我的Github的頁面上」 d發現這一點:https://github.com/robolectric/robolectric/issues/1441

所以我只能根據你的問題說,這是你可以測試你的抽象類,至少Robolectric。

閱讀也:https://gualtierotesta.wordpress.com/2015/01/28/tutorial-java-abstract-classes-testing/

編輯:如今,Robolectric不直接支持API 23,但你可以 「降級」 它測試類的配置,如下圖所示:

@RunWith(RobolectricGradleTestRunner.class) 
@Config(constants = BuildConfig.class, sdk = 21) 
public class MainActivityTest { 

    MainActivity_ activity = Robolectric.setupActivity(MainActivity.class); 

} 
+0

我看了帖子,但Robolectric不支持Android SDK級別23.儘管如此感謝這個信息! –

+0

要有耐心,他們的工作就可以了:https://github.com/robolectric/robolectric/issues/1865#issuecomment-167267371 – piotrek1543

+0

哦!我忘了更新我的Robolectric版本。我會再試一次。非常感謝你! –

0

錯誤因爲BaseActivity沒有在Android Manifest中註冊,所以顯示。似乎有一些解決方案可以在測試包中添加活動。

然而,我最終選擇了另一種解決方案,委派活動的生命週期給他人。 這個想法在Mosby劇本中提到。

http://hannesdorfmann.com/android/mosby-playbook/

新BaseActivity:

public abstract class BaseActivity extends AppCompatActivity implements BaseMvpView, DelegateCallback{ 

private ActivityMvpDelegate activityDelegate; 

    protected ActivityMvpDelegate getActivityDelegate() { 
     if (activityDelegate == null) { 
      activityDelegate = createActivityDelegate(); 
     } 
     return activityDelegate; 
    } 

    protected ActivityMvpDelegate createActivityDelegate() { 
     return new ActivityMvpDelegateImpl(this, this); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     getActivityDelegate().onCreate(savedInstanceState); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     getActivityDelegate().onDestroy(); 
    } 

} 

最後,我可以測試委託類不活動的整個生命週期。