2015-04-23 15 views
5

Tôi có thể sử dụng Robolectric để kiểm tra xem Hoạt động có bắt đầu một Dịch vụ với một Gói cụ thể được chuyển với Mục đích không? Trả lời: Có!Sử dụng Robolectric để kiểm tra bắt đầu một dịch vụ với các tính năng bổ sung ý định?

Tôi muốn viết một bài kiểm tra Robolectric dựa trên kiểm tra rằng MainActivity bắt đầu của tôi MyService với một số cụ thể được thông qua vào extras ý:

trong "MainActivity.java" Tôi có phương pháp

public void startMyService() { 
    Intent i = new Intent(this, MyService.class); 
    Bundle intentExtras = new Bundle(); 
    // TODO: Put magic number in the bundle 
    i.putExtras(intentExtras); 
    startService(i); 
} 

và đây là trường hợp thử nghiệm của tôi "MainActivityTest.java":

import ... 

@RunWith(RobolectricGradleTestRunner.class) 
@Config(constants = BuildConfig.class) 
public class MainActivityTest extends TestCase { 
    @Override 
    protected void setUp() throws Exception { 
    super.setUp(); 
    } 

    @Override 
    protected void tearDown() throws Exception { 
    super.tearDown(); 
    } 

    @Test 
    public void testShallPassMagicNumberToMyService() { 
    MainActivity activityUnderTest = Robolectric.setupActivity(MainActivity.class); 
    activityUnderTest.startMyService(); 

    Intent receivedIntent = shadowOf(activityUnderTest).getNextStartedService(); 

    assertNotNull("No intents received by test case!", receivedIntent); 

    Bundle intentExtras = receivedIntent.getExtras(); 
    assertNotNull("No intent extras!", intentExtras); 

    long receivedMagicNumber = intentExtras. 
      getLong(MyService.INTENT_ARGUMENT_MAGIC_NUMBER); 

    assertFalse("Magic number is not included with the intent extras!", 
      (receivedMagicNumber == 0L)); // Zero is default if no 'long' was put in the extras 
    } 
} 

Vì vậy, câu hỏi của tôi là: Tôi có thể sử dụng Robolectric cho mục đích này không?

Tôi nghĩ rằng tôi figured này ra, xem trả lời dưới đây ...

Các trường hợp thử nghiệm không làm việc vì nó báo cáo "Không extras ý định!". Sử dụng trình gỡ rối tôi đã nhận thấy rằng Intent.putExtras() không có hiệu lực trong môi trường Robolectric. Thuộc tính i.mExtras (Intent.mExtras) được đặt chính xác thành tham chiếu Nhóm khi tôi chạy ứng dụng trên thiết bị của mình. Khi tôi chạy trường hợp thử nghiệm, nó là null. Tôi cho rằng điều này gợi ý rằng câu trả lời cho câu hỏi của tôi là "không", vì vậy tôi có nên từ bỏ trường hợp kiểm tra này hay không có cách nào để thực hiện bài kiểm tra này?

Edit: Sửa chữa các phương pháp dụ startMyActivity() để phản ánh những gì tôi thực sự đã có một vấn đề với: (?) Có vẻ như Intent.mExtras bất động sản không được dân cư, trừ khi có một số nội dung trong Bundle. Điều này khác với môi trường Android trực tiếp, đó là những gì tôi đã phân tích với trình gỡ rối.

Trả lời

1

Tôi không hoàn toàn chính xác trong cách tôi trình bày mã ví dụ của mình! Tôi đã cập nhật ví dụ để hiển thị mã tôi gặp sự cố.

Hóa ra có sự khác biệt về cách Intent được quản lý trong môi trường Robolectric so với môi trường Android thực. Với Robolectric Intent.mExtras không được điền bởi Intent.putExtras() trừ khi có một số nội dung trong số Bundle được thêm vào số Intent làm tính năng bổ sung.

+1

Thú vị. Tôi nghĩ theo mặc định, Robolectric đang sử dụng API16 AOSP. Phiên bản Android bạn đang gỡ lỗi là gì? Bạn có thể thêm '@Config {emulateSdk = } vào bài kiểm tra của mình không? Tôi chỉ tự hỏi nếu nó là cụ thể của phiên bản Android hoặc Robolectric –

+0

Hi Eugen, cảm ơn bạn cho gợi ý này. Tôi đang sử dụng 'targetSdkVersion 19' cho ứng dụng. Tôi đã thử 'emulateSdk = {16,18,21}' cho bài kiểm tra nhưng kết quả luôn luôn giống nhau: Nếu tôi làm 'Intent.putExtras()' với một 'Bundle' mới mà tôi chưa thêm bất kỳ dữ liệu nào vào, sau đó 'Intent.mExtras' vẫn còn' null' trong môi trường Robolectric. "AOSP" có nghĩa là gì? – jokki

+0

... thêm '19' vào tập hợp các SDK mô phỏng (Robolectric). – jokki

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