2016-03-08 19 views
15

Tôi muốn khẳng định rằng Acitivty mà tôi hiện đang thử nghiệm đã kết thúc khi thực hiện một số hành động nhất định. Thật không may cho đến nay tôi chỉ để khẳng định nó bằng cách thêm một số giấc ngủ vào cuối thử nghiệm. Có cách nào tốt hơn ?Espresso cách kiểm tra xem Hoạt động đã kết thúc chưa?

import android.content.Context; 
import android.os.Build; 
import android.support.test.rule.ActivityTestRule; 
import android.test.suitebuilder.annotation.LargeTest; 

import org.junit.Before; 
import org.junit.Rule; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.junit.runners.JUnit4; 

import static org.junit.Assert.assertTrue; 

@SuppressWarnings("unchecked") 
@RunWith(JUnit4.class) 
@LargeTest 
public class MyActivityTest { 

    Context context; 

    @Rule 
    public ActivityTestRule<MyActivity> activityRule 
      = new ActivityTestRule(MyActivity.class, true, false); 

    @Before 
    public void setup() { 
     super.setup(); 
     // ... 
    } 

    @Test 
    public void finishAfterSomethingIsPerformed() throws Exception { 

     activityRule.launchActivity(MyActivity.createIntent(context)); 

     doSomeTesting(); 

     activityRule.getActivity().runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       fireEventThatResultsInTheActivityToFinishItself(); 
      } 
     }); 

     Thread.sleep(2000); // this is needed :(

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
      assertTrue(activityRule.getActivity().isDestroyed()); 
     } 

    } 

} 

Trả lời

0

Bạn có thể sử dụng mẫu StartActivityForResult bên dưới, mô tả khác trong liên kết.

Làm thế nào để bắt đầu Hoạt động từ FirstActivity:

Intent i = new Intent(this, SecondActivity.class); 
startActivityForResult(i, 1); 

Đó là cách để kết thúc SecondActivity bạn quay trở lại đầu tiên (mà không gửi kết quả):

Intent returnIntent = new Intent(); 
setResult(Activity.RESULT_CANCELED, returnIntent); 
finish(); 

Làm thế nào để Nâng cao tổ chức sự kiện khi SecondActivity xong (được viết trong FirstActivity):

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

    if (requestCode == 1) { 

    } 
}//onActivityResult 

Bạn có thể tìm thấy ở đây: http://developer.android.com/training/basics/intents/result.html và có How to manage `startActivityForResult` on Android? đó cũng là cách bạn có thể gửi dữ liệu bạn muốn nhận từ SecondActivity.

+0

Cảm ơn phản hồi của bạn. Tôi đoán tôi không đủ rõ ràng. Vấn đề của tôi là tôi không có hoạt động thứ hai hoặc hoạt động đầu tiên. Tôi chỉ có một Hoạt động. Vì vậy, tôi có thể sử dụng giải pháp của bạn chỉ khi tôi bắt đầu một hoạt động giả đầu tiên chỉ để có thể bắt đầu Activtiy của tôi mà tôi muốn kiểm tra từ đó .. – IHeartAndroid

+0

để bạn có runnable và muốn làm điều gì đó sau khi nó kết thúc? –

+0

Tôi muốn đảm bảo rằng hoạt động của mình bị đóng sau khi fireEventThatResultsInTheActivityToFinishItself(); được gọi là – IHeartAndroid

28

Trong trường hợp của tôi, tôi có thể kiểm tra cho isFinishing():

assertTrue(activityTestRule.getActivity().isFinishing());

thay vì:

Thread.sleep(2000); // this is needed :(

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
     assertTrue(activityRule.getActivity().isDestroyed()); 
    } 

Một ưu điểm khác của isFinishing() là, bạn không cần phải kiểm tra bản.

+0

Điều chắc chắn, bằng cách sử dụng 'isFinishing()' là tốt đẹp, nhưng bạn không giải quyết được điểm chính của câu hỏi đó là cách làm việc xung quanh giấc ngủ. –

+0

Trong sự hiểu biết của tôi, OP đã yêu cầu một cách tốt hơn để khẳng định, vì vậy anh ta có thể tránh 'Thread.sleep'. – keineantwort

+1

Tôi nhận thấy rằng bạn có thể tránh 'Thread.sleep()' sau khi kiểm tra mã của bạn. Tuy nhiên bạn quên đề cập đến vì vậy tôi đã chỉnh sửa câu trả lời của bạn để làm cho điểm rõ ràng hơn. –

0

Không chắc chắn nếu nó là một thực hành tốt nhưng điều này đã làm việc cho tôi:

assertTrue(mTestRule.getActivity() == null); 
Các vấn đề liên quan