2012-11-07 27 views
5

Tôi đang viết một trường hợp kiểm tra JUnit cho ứng dụng Android của mình. Lớp kiểm tra mở rộng ActivityInstrumentationTestCase2 và gọi sendKeys() để mô phỏng đầu vào của người dùng cho các tiện ích TextEdit. Tuy nhiên, tất cả các mã khóa chữ cái (ví dụ: KeyEvent.KEYCODE_G) chỉ gửi các chữ cái viết thường đến TextEdit. Tôi đã thử gửi KeyEvent.KEYCODE_SHIFT_LEFT trước khi gửi mã khóa chữ cái, nhưng điều đó dường như không hoạt động. Vậy làm thế nào để mô phỏng người dùng gõ một chữ hoa?Gửi các chữ cái viết hoa lên TextEdit trong các bài kiểm tra cụ thể

Edit:

Tôi có thể nhập chữ cái viết hoa bằng tay. Thực tế, EditText được định nghĩa là

<EditText android:id="@id/brand_text" 
       android:singleLine="true" 
       android:capitalize="words" 
       android:hint="@string/brand_hint" 
    /> 

Thuộc tính android:capitalize="words" buộc bàn phím ảo vào chế độ chữ hoa trong trình giả lập. (Tôi giả định nó sẽ làm tương tự trên một thiết bị nhưng không có một để kiểm tra nó trên.) Kể từ khi giả lập mà đi kèm với SDK không mô phỏng bàn phím phần cứng, tôi đã không thể kiểm tra giao diện người dùng của tôi hoạt động như thế nào phím cứng.

Tôi cũng đã cố gắng

EditText brandText = this.activity.findViewById(R.id.brand_text); 
brandText.setText(someString); 

Tuy nhiên, thử nghiệm thất bại khi tôi đã làm điều này. Tôi rìu tất cả mã đó, vì vậy tôi không có chi tiết ở đây vào lúc này. Tôi sẽ cố gắng tạo lại nó và chỉnh sửa câu hỏi này với những chi tiết đó.

+0

Bạn đã thử gửi như sendKeys ("A"); thay vì KeyEvent.KEYCODE_A) –

+0

@DurairajP Có, 'sendKeys (" A ")' tương đương với 'sendKeys (KeyEvent.KEYCODE_A)'. [Theo tài liệu 'sendKeys (String)'] (http://developer.android.com/reference/android/test/InstrumentationTestCase.html#sendKeys (int ...)): "Chuỗi khóa là một chuỗi chứa các tên khóa như được chỉ định trong KeyEvent, không có tiền tố KEYCODE_. " –

+0

@ Code-Guru: Trong câu hỏi của bạn, bạn nói bạn đã thử 'KeyEvent.KEYCODE_LEFT_SHIFT' trước mã chữ cái. Tôi giả sử đó là lỗi đánh máy vì nó phải là 'KeyEvent.KEYCODE_SHIFT_LEFT'. – Squonk

Trả lời

4

Tôi đã không đề cập đến trong OP của mình rằng tôi đã viết một phương thức để gửi các ký tự của một String đến một hộp văn bản. Tôi đã thử sử dụng setText() như đề xuất @PaulHarris nhưng không thể làm cho nó hoạt động; các xét nghiệm của tôi vẫn thất bại trong một số xác nhận.

Sau một số lần đào, cuối cùng tìm thấy Instrumentation.sendStringSync() hoạt động cho mục đích của tôi. (Bạn có thể nhận được một đối tượng Instrumentation bằng cách gọi getInstrumentation() trong lớp kiểm tra của bạn.)

1

Nếu bạn muốn làm một cái gì đó như:

EditText brandText = this.activity.findViewById(R.id.brand_text); 
brandText.setText(someString); 

gì bạn thực sự cần phải làm là:

EditText brandText = this.activity.findViewById(R.id.brand_text); 
instrumentation.runOnMainSync(new Runnable() { 
    @Override 
    public void run() { 
     brandText.setText(someString); 
    } 
}); 

này là bởi vì bạn cần phải làm bất cứ tương tác với gui trên UI Chủ đề (hoặc chủ đề chính bất kỳ tên nào bạn thích).

Một phương pháp như thế này:

public void setText(EditText editText, final String textToSet){ 
    instrumentation.runOnMainSync(new Runnable() { 
     @Override 
     public void run() { 
      brandText.setText(textToSet); 
     } 
    }); 
} 

nên làm việc cho bạn tốt.

+0

Nếu/khi bạn có thời gian, bạn có thể xem câu hỏi liên quan của tôi tại http://stackoverflow.com/questions/13169235/preferred- cách-to-test-edittext-input-in-an-android-junit-class? –

+0

Ngoài ra, sự khác biệt giữa 'Instrumentation.runOnMainSync()', 'ActivityInstrumentationTestCase2.runTestOnUiThread()', và 'Activity.runOnUiThread()' (khác với cái đầu tiên chạy đồng bộ) là gì? –