2012-10-24 29 views
12

Tôi đã Hoạt động sau đây:Testing onActivityResult()

package codeguru.startactivityforresult; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.Toast; 

public class StartActivityForResult extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     this.startButton = (Button) this.findViewById(R.id.start_button); 
     this.startButton.setOnClickListener(onStart); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     int result = data.getIntExtra(StartActivityForResult.this.getString(R.string.result), -1); 
     String msg = "requestCode=" + requestCode + ", resultCode=" + resultCode + ", result=" + result; 
     Toast.makeText(this, msg, Toast.LENGTH_LONG).show(); 
    } 

    private View.OnClickListener onStart = new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Intent intent = new Intent(StartActivityForResult.this, ChildActivity.class); 

      StartActivityForResult.this.startActivityForResult(intent, R.id.child_request); 
     } 
    }; 
    private Button startButton = null; 
} 

Và thử JUnit sau:

package codeguru.startactivityforresult; 

import android.app.Activity; 
import android.app.Instrumentation; 
import android.test.ActivityInstrumentationTestCase2; 
import android.test.UiThreadTest; 
import android.widget.Button; 
import junit.framework.Assert; 

public class StartActivityForResultTest extends ActivityInstrumentationTestCase2<StartActivityForResult> { 

    public StartActivityForResultTest() { 
     super(StartActivityForResult.class); 
    } 

    @Override 
    public void setUp() throws Exception { 
     super.setUp(); 

     this.setActivityInitialTouchMode(false); 

     this.activity = this.getActivity(); 
     this.startButton = (Button) this.activity.findViewById(R.id.start_button); 
    } 

    @Override 
    public void tearDown() throws Exception { 
     this.activity.finish(); 

     super.tearDown(); 
    } 

    @UiThreadTest 
    public void testStartButtonOnClick() { 
     Assert.assertTrue(this.startButton.performClick()); 

     Instrumentation.ActivityResult result = new Instrumentation.ActivityResult(Activity.RESULT_OK, null); 
     Assert.assertNotNull(result); 

     Instrumentation.ActivityMonitor am = new Instrumentation.ActivityMonitor(ChildActivity.class.getName(), result, true); 
     Assert.assertNotNull(am); 

     Activity childActivity = this.getInstrumentation().waitForMonitorWithTimeout(am, TIME_OUT); 
     Assert.assertNotNull(childActivity); 

     Assert.fail("How do I check that StartActivityForResult correctly handles the returned result?"); 
    } 
    private Activity activity = null; 
    private Button startButton = null; 
    private static final int TIME_OUT = 5 * 1000; // 5 seconds 
} 

Như bạn thấy đấy, tôi đã tìm ra cách để giả lập một kết quả sử dụng Instrumentation.ActivityResultInstrumentation.ActivityMonitor. Làm cách nào để kiểm tra rằng StartActivityForResult.onActivityResult() xử lý đúng kết quả này?

+0

Không có liên kết với câu hỏi, nhưng không cần phải viết 'Assert.assert * (...)', vì 'ActivityInstrumentationTestCase2' mở rộng' junit.framework.Assert': 'assert * (...)' là một phương thức thể hiện và có thể được gọi trực tiếp. – Vince

+1

@Vince Vâng, tôi biết điều này. Cá nhân tôi thích sử dụng cụ thể này vì tất cả các phương thức 'assert *()' là tĩnh. –

Trả lời

1

Sử dụng các ý định đến thử kết quả hoạt động

intending(hasComponent(DummyActivity.class.getName())).respondWith(new ActivityResult(resultCode, dataIntent)); 
rule.getActivity().startActivityForResult(new Intent(context,DummyActivity.class)); 

xác minh về hoạt động kết quả luận lý

-2
+0

Như bạn thấy từ mã của tôi, tôi biết cách sử dụng 'onActivityResult()' trong hoạt động 'StartActivityForResult' của mình. Câu hỏi của tôi là làm thế nào để viết một bài kiểm tra JUnit để đảm bảo rằng nó hoạt động chính xác. –

9

Để thử nghiệm onActivityResult() trong lớp thử nghiệm của bạn, tất cả các bạn cần làm là:

  1. Tạo một ActivityMonitor mà bắt tạo ChildActivity và retuning các mock ActivityResult.
  2. Mô phỏng nhấp chuột vào nút khởi động ChildActivity cho kết quả.
  3. Thực hiện một số xác nhận về trạng thái và ActivityResult giả lập.

mẫu StartActivityForResult:

public class StartActivityForResult extends Activity { 
    private boolean activityResultIsReturned = false; 
    private String activityResult = null; 

    ... ... 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    activityResultIsReturned = true; 
    activityResult = data.getStringExtra("result"); 

    ... ... 
    } 

    ... ... 
} 

mẫu StartActivityForResultTest: Khung

public class StartActivityForResultTest extends ActivityInstrumentationTestCase2<StartActivityForResult> { 
    ... ... 

    public void testOnActivityResult() { 
    // Get current Activity and check initial status: 
    StartActivityForResult myActivity = getActivity(); 
    assertFalse(myActivity.getActivityResultIsReturned()); 
    assertNull(myActivity.getActiityResult()); 

    // Mock up an ActivityResult: 
    Intent returnIntent = new Intent(); 
    returnIntent.putExtra("result", "This is the result"); 
    Instrumentation.ActivityResult activityResult = new Instrumentation.ActivityResult(Activity.RESULT_OK, returnIntent); 

    // Create an ActivityMonitor that catch ChildActivity and return mock ActivityResult: 
    Instrumentation.ActivityMonitor activityMonitor = getInstrumentation().addMonitor(ChildActivity.class.getName(), activityResult , true); 

    // Simulate a button click that start ChildActivity for result: 
    final Button button = (Button) myActivity.findViewById(com.company.R.id.open_next_activity); 
    myActivity.runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
     // click button and open next activity. 
     button.performClick(); 
     } 
    }); 

    // Wait for the ActivityMonitor to be hit, Instrumentation will then return the mock ActivityResult: 
    ChildActivity childActivity = getInstrumentation().waitForMonitorWithTimeout(activityMonitor, 5); 

    // How do I check that StartActivityForResult correctly handles the returned result? 
    assertTrue(myActivity.getActivityResultIsReturned()); 
    assertEqual(myActivity.getActiityResult(), "This is the result"); 
    } 

    ... ... 
} 
+0

Cảm ơn các đề xuất. Lớp StartActivityForResult của tôi trong bài gốc chỉ đơn giản là một ví dụ. Trong ứng dụng thực sự của tôi, tôi có gần một chục hoạt động khác nhau để kiểm tra. Một số hoạt động này trả lại nhiều hơn một phần dữ liệu. Mã thử nghiệm của bạn cho thấy rằng tôi phải sửa đổi giao diện của từng Hoạt động chỉ để thử nghiệm bằng cách thêm getters cho mỗi phần dữ liệu được trả về bởi hoạt động con. Tôi không nhớ công việc phụ của việc viết mã này. Tôi không hoàn toàn hài lòng với việc làm ô nhiễm mã sản xuất với mã chỉ được sử dụng để thử nghiệm. –

+0

Đây chỉ là mẫu để hiển thị cách kiểm tra onActivityResult() và thực hiện một số xác nhận cơ bản, phụ thuộc vào nhu cầu của bạn, bạn không cần thay đổi lớp Activity trong mọi trường hợp, ví dụ, nếu tất cả onActivityResult() của bạn cập nhật một số UI công cụ tức là một TextView, bạn có thể trực tiếp kiểm tra các văn bản cập nhật mà không cần thêm bất kỳ biến dụ và getter/setter phương pháp. – yorkw

+0

Đó là một điểm tốt. Tôi tưởng tượng rằng hầu hết thời gian 'onActivityResult()' sẽ sửa đổi giao diện người dùng theo một cách nào đó, như bạn đã nói. –