gpt4 book ai didi

android - 是否可以在单元测试下模拟 android 服务?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:13:36 27 4
gpt4 key购买 nike

我正在尝试为我的 android 应用程序编写单元测试,我想模拟我的服务类。我想测试服务中的一些错误行为,例如连接错误或找不到文件。

为了简化我的问题,我启动了一个新的 Android 项目并创建了一个 Activity 和一个 Service 类:

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);
}

}

然后我用这个单元类创建了一个新的 Android 测试项目:

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));
}
}

当我运行单元测试时,前提条件和更改按钮测试都没有问题。例如,我想做的是创建一个 MyServiceMock 并覆盖 MyService.getNewString 以返回其他值,并在测试中模拟该对象。

像这样:

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!";
}
}

这可能吗?

最佳答案

是的,这是可能的,我认为上面的 MyServiceMock.java 示例也是一个替代方案。

有一些模拟框架可供您使用。

我对 Mockito 有一些经验.

您可以只模拟 MyService 类并指定在调用 getNewString 方法时返回一个字符串“This is the new value!”。

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

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

您还可以使用 Mockito.doThrow() 方法在调用 mock 方法时抛出异常:

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

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

关于android - 是否可以在单元测试下模拟 android 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7583697/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com