如何使用Mock来测试Files,Database和ContentProviders
首个先我们创建一个应用,功能很简单就是读取该应用目录下的一个txt文件内容,并展示到应用的activity上。
十余年的东兴网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。网络营销推广的优势是能够根据用户设备显示端的尺寸不同,自动调整东兴建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联建站从事“东兴网站设计”,“东兴网站推广”以来,每个客户项目都认真落实执行。
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 ActivityUnitTestCaseMockContextExampleActivity {
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文件的,数据库的使用也是一样的。
如何在phpunit中mock一个单例类
当我们对A类进行单元测试时,A类可能依赖了B类,为了减少依赖,方便A类方法的测试,我们可以模拟一个B类,简单规定其各方法的返回值(而非真正实现具体逻辑)。Phpunit中提供了一套模拟类的api,简单使用如下:
[php] view
plaincopyprint?
class StubTest extends PHPUnit_Framework_TestCase
{
public function testStub()
{
// Create a stub for the SomeClass class.
$stub = $this-getMock('SomeClass');
// Configure the stub.
$stub-expects($this-any())
-method('doSomething')
-will($this-returnValue('foo'));
// Calling $stub-doSomething() will now return
// 'foo'.
$this-assertEquals('foo', $stub-doSomething());
}
}
class StubTest extends PHPUnit_Framework_TestCase
{
public function testStub()
{
// Create a stub for the SomeClass class.
$stub = $this-getMock('SomeClass');
// Configure the stub.
$stub-expects($this-any())
-method('doSomething')
-will($this-returnValue('foo'));
// Calling $stub-doSomething() will now return
// 'foo'.
$this-assertEquals('foo', $stub-doSomething());
}
}
在这个例子中,我们得到了一个'SomeClass'的模拟,规定其可以被调用任意次,如果调用doSomething方法,将得到值foo。
问题:
我们知道,对于一个单例类,其constructor方法为private,而getMock的实现,默认是要调用原类的constructor方法。
如果SomeClass为单例,phpunit将会提示
Call to private SomeClass::__construct() from context 'PHPUnit_Framework_TestCase'
这时,我们的测试该如何进行呢?
解决:
仍然使用getMock进行模拟。
只要将其第5个参数设为false即可。其含意是:不调用原对象的构造函数。
[php] view
plaincopyprint?
$stub = $this-getMock('SomeClass', array(), array(), '', false);
$stub = $this-getMock('SomeClass', array(), array(), '', false);
不得不说,这样使用有点复杂。
如果你使用的是phpunit3.5及以上版本提供了更易用的api,你可以这样禁掉对原有constructor方法的调用。
$stub=$this-getMockBuilder('SomeClass')-disableOriginalConstructor()-getMock();
附:
对getMock的6个可选参数的详解,
手册中并未提及它们的默认值,经测试得到结果如下:
array(), array(), '', false, false, false
即
$stub=$this-getMockBuilder('SomeClass')
等同于:
$stub=$this-getMockBuilder('SomeClass',array(), array(), '', true, false, false)
php单元测试怎么写
写过JAVA和C++的单元测试,PHP,没必要也没写过。单元测试主要是对核心的类和方法进行测试,在J2EE开发中,由于各种配置比较繁琐,并且是分层开发,所以很有必要写单元测试。比如,我做了一个service,我就可以针对这个service写个单元测试,取出这个bean,来验证是否正常,而不必等到ACTION层写好后,配置完整再来测试。对J2EE来说,service正常后,ACTION我就不用管了。做单元测试也容易提早发现问题。并且eclipse自带了iunit,使用极其方便。C++也一样,流程比较复杂,为了尽快验证和发现问题,有做单元测试的必要。而PHP这类脚本,不需要。我也很少见人提到过php的单元测试。本身逻辑就不复杂,而且大多数也不分层。NETBEAN自带了phpunit,不过从没用过如果还有不明白的话,你可以在后盾人看看视频找找答案,有空多看看时间长了,慢慢就明白了,希望能帮到你,给个采纳吧谢谢グッ!(๑•̀ㅂ•́)و✧
php网站本地测试数据库怎么连接?
?php
$conn
=
mysql_connect('localhost','root','')
or
die('连接数据库失败,请检查您的数据库配置');
?
mysql_connect第二个参数是用户名,第三个参数
默认情况下,用上面测试下,如果不行就看下面是密码
?php
$conn
=
mysql_connect('localhost','用户名','密码')
or
die('连接数据库失败,请检查您的数据库配置');
?
文章题目:php单测mock数据库 php测试数据库连接
文章链接:http://scgulin.cn/article/dopcdos.html