2016-04-11 9 views
10

私はエスプレッソで意図的に起動することを検証するためのテストを作成しようとしていますが、意図は何も意図を記録していません。ボタンがない場合、エスプレッソは何も意図していません

私はこのテスト

@Test 
public void shoulddosomething(){ 
    startActivity(); 
    intended(hasComponent(hasClassName(TemplatePictureCaptureActivity.class.getName()))); 

} 

を持っており、私の活動では、私はこのコード

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(onRequestLayout()); 
    Intent intent = new Intent(this, TemplatePictureCaptureActivity.class); 
    startActivity(intent); 
} 

テスト結果がこれですを持っています。

android.support.test.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError: Wanted to match 1 intents. Actually matched 0 intents. 

IntentMatcher: has component: has component with: class name: is "cat.helm.recertel.ui.templatepicturecapture.TemplatePictureCaptureActivity" package name: an instance of java.lang.String short class name: an instance of java.lang.String 

Matched intents:[] 

Recorded intents:[] 

私はonClickListen内部の意思を起動しようとした、それが働いていたが、それなしで、私はそれを動作させることはできません。私は運がないままアイドル状態のリソースを試しました。あなたはこれを達成する方法を知っていますか?

+1

(hasComponent(hasClassName(TemplatePictureCaptureActivity.class.getName())))));); – ozo

+0

ありがとうございました。しかし、それは悪いコードのにおいではない? – Borja

+0

私はそうは思わない。私はビューがまだインテントをテストしている間、まだ準備が整っていないと思う、アンドロイドはまだビュー(setContentView(onRequestLayout())を設定している、それは理由を見つけることができない理由です。ボタンクリックの場合は、ビューが設定された後でクリックします。 – ozo

答えて

8

前に少し待ってみてください。

@Test 
public void shoulddosomething() { 
    startActivity(); 
    String templatePictureActivityClassName = TemplatePictureCaptureActivity.class.getName(); 
    Espresso.registerIdlingResources(new WaitActivityIsResumedIdlingResource(templatePictureActivityClassName)); 
    intended(hasComponent(hasClassName(templatePictureActivityClassName))); 
} 

アイドリングリソースをここに:

私の場合、テストは次のように残ります。

private static class WaitActivityIsResumedIdlingResource implements IdlingResource { 
    private final ActivityLifecycleMonitor instance; 
    private final String activityToWaitClassName; 
    private volatile ResourceCallback resourceCallback; 
    boolean resumed = false; 
    public WaitActivityIsResumedIdlingResource(String activityToWaitClassName) { 
     instance = ActivityLifecycleMonitorRegistry.getInstance(); 
     this.activityToWaitClassName = activityToWaitClassName; 
    } 

    @Override 
    public String getName() { 
     return this.getClass().getName(); 
    } 

    @Override 
    public boolean isIdleNow() { 
     resumed = isActivityLaunched(); 
     if(resumed && resourceCallback != null) { 
      resourceCallback.onTransitionToIdle(); 
     } 

     return resumed; 
    } 

    private boolean isActivityLaunched() { 
     Collection<Activity> activitiesInStage = instance.getActivitiesInStage(Stage.RESUMED); 
     for (Activity activity : activitiesInStage) { 
      if(activity.getClass().getName().equals(activityToWaitClassName)){ 
       return true; 
      } 
     } 
     return false; 
    } 

    @Override 
    public void registerIdleTransitionCallback(ResourceCallback resourceCallback) { 
     this.resourceCallback = resourceCallback; 
    } 
} 
+2

テストの後、アイドル状態のリソースの登録を解除することを検討することがあります。 – iamreptar

+0

あなたが1つのアクティビティだけを持っていて、別のデータで何度も何度も起動している場合、それは必ずしも機能しません。 – scriptocalypse

2

溶液が第二の活動を待つためにアイドリングリソースを登録することです

intended(hasComponent(hasClassName(TemplatePictureCaptureActivity.class.getName(‌​)))); 
+2

私はさらに調査を行い、テストが失敗したかどうかに応じて、あなたの解決策は常に機能するとは限りません。私は適切な解決策を見つけました。 – Borja

関連する問題