Android如何使用Mock来测试Files,Database和ContentProviders

Android如何使用Mock来测试Files,Database和ContentProviders

背景

        有时我们需要对文件或数据库进行测试,但我们又不想破坏应用程序或设备原有的数据。此时我们就需要一个Mock来替代他们,这里的Mock不是android.test.mock,但也是android.test包下面的,RenamingDelegatingContext的类。
        首个先我们创建一个应用,功能很简单就是读取该应用目录下的一个txt文件内容,并展示到应用的activity上。
        public class MockContextExampleActivity extends Activity {
public final static String FILE_NAME = “myfile.txt”;
private TextView mTv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mTv = (TextView) findViewById(R.id.TextView01);
final byte[] buffer = new byte[1024];
try {
final FileInputStream fis = openFileInput(FILE_NAME);
final int n = fis.read(buffer);
mTv.setText(new String(buffer, 0, n-1));
} catch (Exception e) {
mTv.setText(e.toString());
mTv.setTextColor(Color.RED);
}
}
//这里写了个getText方法,测试工程会用到。
public String getText() {
return mTv.getText().toString();
}
        运行一下,此时我们的包目录下没有myfile.txt,页面显示的可能是个错误。OK,然后我们创建两个文件。一个名为myfile.txt,一个test.myfile.txt。前者用于应用中显示的文件内容,后者是作为测试Mock调用的。
    echo “This is real data” >data/data/com.example.aatg.mockcontextexample/files/myfile.txt
    echo “This is *MOCK* data” >data/data/com.example.aatg.mockcontextexample/files/test.myfile.txt
        再次运行下,应该可以看到Activity上显示的是This is real data。
        OK,下面开始编写测试代码。我们的目的是测试这个app能够正确读取文件,假设现在我怕是不是开发在代码里写死了“This is real data”这句话(作为测试,有点怀疑精神很正常)。OK,现在我用另外一个文件test.myfile.txt来代替myfile.txt会不会出错。
public class MockContextExampleTest extends ActivityUnitTestCase<MockContextExampleActivity> {
private static final String PREFIX = “test.”;
private RenamingDelegatingContext mMockContext;
public MockContextExampleTest() {
super(MockContextExampleActivity.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
mMockContext = new RenamingDelegatingContext(getInstrumentation().getTargetContext(), PREFIX);
mMockContext.makeExistingFilesAndDbsAccessible();
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
}
public void testSampleTextDisplayed(){
setActivityContext(mMockContext);
startActivity(new Intent(), null, null);
final MockContextExampleActivity mActivity = getActivity();
assertNotNull(mActivity);
String text = mActivity.getText();
assertEquals(“This is *MOCK* data”, text);
}
}
        主要看下RenamingDelegatingContext函数的使用,PREFIX是表示文件或数据库的前缀。另外这里为什么使用getTargetContext方法而不是getContext,后者我们经常在UiTest中使用到。这里其实看下注释就明白了:
//getContext():The instrumentation’s package context.
//getTargetContext(): A Context in the target application.
        运行下测试,pass。这说明getText方法返回的string已经是This is *MOCK* data 而不是 This is real data了。这我就可以证明,开发没有写死这段话。以上就是RenamingDelegatingContext函数如何来mock文件的,数据库的使用也是一样的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值