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ể?
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