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

上一篇 / 下一篇  2014-07-11 16:46:54 / 个人分类:android

有时我们需要对文件或数据库进行测试,但我们又不想破坏应用程序或设备原有的数据。此时我们就需要一个Mock来替代他们,这里的 Mock不是android.test.mock,但也是android.test包下面的,RenamingDelegatingContext的类。

示例参见:D:\workspace\MockTest
*******************MockContextExampleActivity********
package com.example.mocktest;

import java.io.FileInputStream;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Menu;
import android.widget.TextView;

public class MockContextExampleActivity extends Activity {

public final static String FILE_NAME = "myfile.txt";
private TextView mTv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mTv = (TextView) findViewById(R.id.text1);
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();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.mock_context_example, menu);
return true;
}

}

*****************MockContextExampleTest*****************
package com.example.mocktest;

import android.content.Intent;
import android.test.ActivityUnitTestCase;
import android.test.RenamingDelegatingContext;

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

Notice:别忘了在清单文件里加上
<uses-library android:name="android.test.runner"/>

<instrumentation android:name="android.test.InstrumentationTestRunner"
                     android:targetPackage="com.example.mocktest"/>

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文件的,数据库的使用也是一样的。

TAG:

 

评分:0

我来说两句

Open Toolbar