2011-09-28 31 views
8

Tôi đang cố viết các bài kiểm tra đơn vị cho ứng dụng Android của mình và tôi muốn thử lớp dịch vụ của mình. Tôi muốn kiểm tra một số hành vi lỗi trong dịch vụ, chẳng hạn như lỗi kết nối hoặc không tìm thấy tệp.Có thể thử các dịch vụ Android theo thử nghiệm đơn vị không?

Để đơn giản hóa câu hỏi của tôi, tôi bắt đầu một dự án Android mới và tạo ra một hoạt động và một lớp dịch vụ:

MyAndroidProjectActivity.java

package br.org.venturus.android; 

import android.app.Activity; 
import android.content.ComponentName; 
import android.content.Context; 
import android.content.Intent; 
import android.content.ServiceConnection; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.view.View; 
import android.widget.TextView; 
import br.org.venturus.android.service.MyService; 

public class MyAndroidProjectActivity extends Activity { 
    private MyService service; 
    private ServiceConnection mConnection = new ServiceConnection() { 

     public void onServiceConnected(ComponentName className, IBinder binder) { 
      service = ((MyService.MyBinder) binder).getService(); 

     } 

     public void onServiceDisconnected(ComponentName className) { 
      service = null; 
     } 
    }; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     { 
      Intent service = new Intent(this, MyService.class); 
      startService(service); 

      bindService(service, mConnection, Context.BIND_AUTO_CREATE); 
     } 

    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     // stop MyService 
     { 
      Intent svc = new Intent(this, MyService.class); 
      stopService(svc); 
     } 
    } 

    public void doChange(View view) { 
     TextView tv = (TextView) findViewById(R.id.tvHello); 

     tv.setText(service.getNewString()); 
    } 
} 

MyService.java

package br.org.venturus.android.service; 

import br.org.venturus.android.R; 
import android.app.Service; 
import android.content.Intent; 
import android.os.Binder; 
import android.os.IBinder; 

public class MyService extends Service { 

    private IBinder binder; 

    public MyService() { 
     this.binder = new MyBinder(); 
    } 
    @Override 
    public IBinder onBind(Intent intent) { 
     return binder; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 

    } 

    public class MyBinder extends Binder { 
     public MyService getService() { 
      return MyService.this; 
     } 
    } 

    public String getNewString() { 
     return getString(R.string.change); 
    } 

} 

Và tôi đã tạo một dự án thử nghiệm Android mới với đơn vị này s:

MyAndroidProjectActivityTest.java

package br.org.venturus.android.test; 

import android.test.ActivityInstrumentationTestCase2; 
import android.test.UiThreadTest; 
import android.widget.Button; 
import android.widget.TextView; 
import br.org.venturus.android.MyAndroidProjectActivity; 
import br.org.venturus.android.R; 

public class MyAndroidProjectActivityTest extends 
     ActivityInstrumentationTestCase2<MyAndroidProjectActivity> { 

    private MyAndroidProjectActivity mActivity; 
    private TextView tvHello; 
    private Button btChange; 

    public MyAndroidProjectActivityTest() { 
     super("br.org.venturus.android", MyAndroidProjectActivity.class); 
    } 

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

     // Get the activity and components 
     { 
      mActivity = this.getActivity(); 
      tvHello = (TextView) mActivity 
        .findViewById(br.org.venturus.android.R.id.tvHello); 
      btChange = (Button) mActivity 
        .findViewById(br.org.venturus.android.R.id.btChange); 
     } 

    } 

    public void testPreconditions() { 
     assertNotNull(tvHello); 
     assertNotNull(btChange); 
    } 

    @UiThreadTest 
    public void testChangeButton() { 
     assertEquals(tvHello.getText(), getActivity().getString(R.string.hello)); 
     btChange.performClick(); 
     assertEquals(tvHello.getText(), getActivity() 
       .getString(R.string.change)); 
    } 
} 

Khi tôi chạy thử nghiệm đơn vị, các điều kiện trước và kiểm tra nút thay đổi cũng tốt. Những gì tôi muốn làm, ví dụ, là tạo ra một MyServiceMock và ghi đè lên MyService.getNewString để trả về giá trị khác, và giả định đối tượng này trong thử nghiệm.

Something như thế này:

MyServiceMock.java

package br.org.venturus.android.test.service; 

import br.org.venturus.android.service.MyService; 

public class MyServiceMock extends MyService { 
    @Override 
    public String getNewString() {  
     return "This is the new value!"; 
    } 
} 

Là có thể?

Trả lời

3

Có, có thể và tôi nghĩ ví dụ về số MyServiceMock.java ở trên cũng là một thay thế.

Có một vài khung mocking mà bạn có thể sử dụng cho việc này.

Tôi có một số kinh nghiệm với Mockito.

Bạn chỉ có thể thử lớp MyService và chỉ định rằng khi phương thức getNewString được gọi, trả về một chuỗi "Đây là giá trị mới!".

MyService myServiceMock = Mockito.mock(MyService.class); 

Mockito.doReturn("This is the new value!").when(myServiceMock).getNewString(); 

Bạn cũng có thể sử dụng Mockito.doThrow() phương pháp để ném một ngoại lệ khi một phương pháp mô hình được gọi là:

Mockito.doThrow(new RuntimeException()).when(mockedList).clear(); 

//following throws RuntimeException: 
mockedList.clear(); 
+1

mong đợi Setting là phần dễ dàng, nhưng làm thế nào để bạn thay thế dịch vụ được khai báo trong tệp kê khai được bắt đầu bởi khung công tác và tất cả vòng đời ràng buộc với đối tượng giả mà bạn đã tạo: 'myServiceMock'? – TWiStErRob

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