2016-04-11 16 views
10

Tôi đang cố gắng viết một bài kiểm tra để xác minh ý định khởi chạy với espresso, vấn đề là dự định() không ghi lại bất kỳ ý định nào.Espresso không ghi lại bất kỳ ý định nào nếu không có nút

Tôi có xét nghiệm này

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

} 

và trong hoạt động của tôi có mã này

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

Kết quả thử nghiệm là thế này.

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:[] 

Tôi đã cố gắng khởi chạy ý định bên trong onClickListen và nó hoạt động, nhưng không có nó tôi không thể làm cho nó hoạt động. Tôi cũng đã thử với các nguồn tài nguyên không tải không có may mắn. Bạn có biết làm thế nào để đạt được điều này?

+1

Hãy thử chờ một chút trước khi dự định (hasComponent (hasClassName (TemplatePictureCaptureActivity.class.getName()))); – ozo

+0

Cảm ơn. Nhưng nó không phải là một mùi mã xấu? – Borja

+0

Tôi không nghĩ vậy. Tôi đoán xem là chưa sẵn sàng trong khi thử nghiệm ý định, android vẫn thiết lập chế độ xem (setContentView (onRequestLayout())), đó là lý do tại sao nó không thể tìm thấy ý định. Trong trường hợp nhấp vào nút, bạn đang nhấp sau khi chế độ xem được đặt. – ozo

Trả lời

8

Giải pháp là để đăng ký một tài nguyên idling chờ hoạt động thứ hai.

Trong trường hợp của tôi kiểm tra sẽ tiếp tục như sau:

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

Và đây tài nguyên idling.

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

Bạn có thể xem xét việc hủy đăng ký tài nguyên không hoạt động sau khi thử nghiệm. – iamreptar

+0

Điều đó sẽ không nhất thiết phải hoạt động nếu bạn chỉ có một Hoạt động mà bạn đang khởi chạy lại với các dữ liệu khác nhau. – scriptocalypse

2

Cố gắng chờ đợi một chút trước khi

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

Tôi đã thực hiện điều tra thêm và giải pháp của bạn không phải lúc nào cũng hoạt động, tùy thuộc vào khoảng thời gian thử nghiệm không thành công hay không và số tiền này có thể thay đổi. Tôi đã tìm thấy một giải pháp thích hợp. – Borja

Các vấn đề liên quan