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

如何使用Mock来测试Files,Database和ContentProviders,第1张

首个先我们创建一个应用,功能很简单就是读取该应用目录下的一个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文件的,数据库的使用也是一样的。

Mock介绍

1.找到要替换的对象:我们需要测试的是visit_ustack这个函数,那么我们需要替换掉send_request这个函数。

2.实例化Mock类得到一个mock对象,并且设置这个mock对象的行为。在成功测试中,我们设置mock对象的返回值为字符串“200”,在失败测试中,我们设置mock对象的返回值为字符串"404"。

3.使用这个mock对象替换掉我们想替换的对象。我们替换掉了client.send_request

4.写测试代码。我们调用client.visit_ustack(),并且期望它的返回值和我们预设的一样。

上面这个就是使用mock对象的基本步骤了。在上面的例子中我们替换了自己写的模块的对象,其实也可以替换标准库和第三方模块的对象,方法是一样的:先import进来,然后替换掉指定的对象就可以了。

Mockrunner用在J2EE环境中进行应用程序的模拟测试。它不仅支持Struts actions,servlets,过滤器和标签类,还包括一个JDBC和一个JMS测试框架,可以用于测试基于EJB的应用程序。

Mockrunner扩展了JUnit并模拟了必要的行为,而无需调用实际的基础结构。它不需要正在运行的应用程序服务器或数据库。此外,它不会调用web容器或Struts ActionServlet。它非常快速,使用户可以在测试的所有步骤中 *** 纵所有涉及的类和模拟对象。它可以用于为基于J2EE的应用程序编写非常复杂的单元测试,而不会产生任何开销。Mockrunner不支持任何类型的容器内测试。

Mockrunner不会读取任何配置文件,例如web.xml或struts-config.xml。您可以使用Mockrunner API指定所有参数。因此,可以将servlet,过滤器,标签和Struts动作作为可重用组件进行测试,而不管您在一个或另一个应用程序中使用的设置如何。无法测试配置文件中的定义。如果要这样做,可以将StrutsTestCase用于基于Struts的应用程序或Cactus。

Mockrunner支持Java版本从1.3到1.6以及J2EE 1.3,J2EE 1.4和JavaEE5。尚不支持EJB 3.0。Mockrunner支持Struts版本1.1、1.2和1.3。

下载地址:Mockrunner download | SourceForge.net

最后:【可能给你带来帮助的教程】软件测试最新自学教程


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/10869396.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-11
下一篇2023-05-11

发表评论

登录后才能评论

评论列表(0条)

    保存