- 前面说过 JMockit 因身处前线,所以简直无不可,本节例子演示 JMockit 怎么 Mock 私有方法和私有属性,示例虽然是静态方法和属性,但因采用的是反射手法,所以这种 Deencapsulation 的 Mock 手段同样适用于公有的方法或属性,无论是否静态。
本文所用 JMockit 版本为 1.6, 可能网上所搜索的方法与此有所不同,请注意 JMockit 版本差异。仍需重复一下,运行 JMockit 的例子 classpath 上必须让 jmockit.jar 在 junit.jar 之前,或用 javaagent 参数来加载 jmockit.jar,并且 junit 要 4.8 及以上版本.
1. Mock 私有方法(非静态类似) Read More - TDD 推求测试先行,不光在自己代码未实现时可以先做好测试,即使平台依赖或第三方接口未准备好我们也能先行一步的,这就要对接口依赖进行 Mock。同时 Mock 也使得我们的测试代码在运行当中不至于随着第三方接口的沦陷而坠入深渊。
Java 中 Mock 工具也不少,像通用 EasyMock, jMock, Mockito, Unitils Mock, PowerMock, 再比如偏专业的 HttpMock, StrutsMock 等。但 JMock 与前面各位相比简直是全能选手,对 final/static/native/private 方法都能 Mock,功能上还远不止这些了,可以看看一个对比图 https://code.google.com/p/jmockit/wiki/MockingToolkitComparisonMatrix。
JMockit 是基于 Java5 的 java.lang.instrument 包开发的,所以它才能夺得先机,也可陷得更深。自然它要求 JDK5 及以上,JUnit 4.8 及以上版本。命令行下原来用 -javaagent:/.../lib/jmockit.jar 加载 JMockit,现在发现把 jmockit.jar 放在 classpath 下就 OK 的,但是必须放在 junit.jar 包之前,否则你会看到这个 java.lang.IllegalStateException: JMockit wasn't properly initialized; check that jmockit.jar precedes junit.jar in the classpath。 JMockit 有两种 Mock 方式:
1. Behavior-oriented(Expectations & Verifications) --- 基于代码执行行为的模仿,象黑盒测试
2. State-oriented(MockUp<GenericType>) --- 侵入类内部,随意模仿,似白盒,可以说是能为所欲为
此篇体验下第一种 Mock 方式,在测试代码中最直观就是那个new Expectations(...){{result = some;}},下面来看个实际的例子。应用场景是 Read More - 使用 Ant 进行自动化处理时,不想记住每一个 target 的名称,而是让默认的 target 列出需要的 target 出来,让用户输入名称或数字选择执行哪个 target。这样做自然是多了一步,有时候确也方便不少,但 Ant 还是有个缺点,它不能持久性的保持在 Ant 控制台下,持续的进行用户交互。
对于实现 Ant 的简单用户交互,我们可以借助于两个 Task,input 和 antcall, input 用来提示用户输入值,再根据 input 设定的属性来确定 antcall 调用哪个 target。执行完退出到系统 Shell 下,想要再来,就再执行一下 ant 吧,我也只能做到这一步了。
看下面的例子 build.xml 内容 Read More - 之前关注过一些嵌入式数据库,倒时 SQLite 风头更劲,在 Android 上被应用,在 HTML5 中一些浏览器的 Local Database 的实现也是 SQLite。因在 PhoneGap 中使用数据库存储的选择也期待着它的表现,首先要建个数据库,第一要义就是主键的选择,自增列是最有效更简单的。
这里就看下 SQLite 怎么使用自动列,了解三个内容,ROWID, ROWID 的别名,自动列与序列表,归根结底它们都是 ROWID。
1. ROWID
每个表默认都有 rowid 列,除非创建表时指定了 WITHOUT ROWID, 它现在是 64 位长的。在查询时用select * from table1里没有它,要显式的用select rowid, * from table1就会列出它来。
2. ROWID 的别名
Read More - 移动开发有三条路,Native, HTML5 和 Hybrid,Native 可以把各种平台的特性充分发挥,HTML5 简单,可限制太多,混合型是个折中的办法。对于那些不很注重特效又需要访问部分本地资源的应用可采用 Hybrid 的方式,而其中的佼佼者就数 PhoneGap,又说 Cordova。它们是两个主,却又基本相似的东西,见 PhoneGap, Cordova, and what’s in a name?
我们既可以选择 PhoneGap,也可以选择 Cordova,安装使用起来基本类似,再往下的发展的就无定数了。鉴于 PhoneGap 依托于 Adobe 那么一个强大的后台,我还是选择试用下 PhoneGap,并且 Adobe 还为它提供了在线构建和源码托管 http://build.phonegap.com。当然这是一家像 Oracle 那样商业气息比较浓的公司,使用在线构建免费用户只能建立一个应用。
现在看一个应用 PhoneGap 的例子,从安装开始,演示平台为 Mac, 其他平台都类似。PhoneGap 可由 NodeJS 来安装,所以首先要在 http://nodejs.org 安装 NodeJS。然后执行下面的命令安装 phonegap: Read More - Emacs 默认的样子总觉不怎么可爱,所以想要找个主题来装饰一番。试过 http://www.emacswiki.org/emacs/ColorTheme 介绍的办法,从这里下载 http://www.nongnu.org/color-theme 主题文件,并且在 ~/.emacs 中添加了以下几句话:
(require 'color-theme)
重启 Emacs 后不能发现界面有变化,但是在 Emacs 中可以用
(color-theme-initialize)
(color-theme-robin-hood)M-x color-theme-select看到装载进来的主题,M-x color-theme-hober执行后也能看到应用上了这个主题,就是无法持久到下次 Emacs 运行。再次试验了ColorTheme 提到的多种方法都不奏效。
好像是因为我安装的是 Emacs 24 的版本,它有自己的默认主题deftheme, 和其他备选主题,M-x customize-themes可以看到下面这样的界面 Read More
在前面我们的 Backbone.js 用上了 Model, 但绝大数的情况下我们处理的都是一批的 Model 数据列表,所以需要有一个 Collection 来容纳 Model, 就像 Java 里最常用的 List。
声明 Collection 时需要指定他处理的 Model 类型,也就是个泛型参数,如我们这样定义 Collection:1//define Collection 2var PeopleCollection = Backbone.Collection.extend({ 3 model: Person //like generic 4});
然后就是往 Collection 中如何填充 Model 实例,有好多种,这里只演示最直接的方式。还 add, fetch, 及对 Collection 排序, 遍历等各种操作。 Read More
前面几篇 Backbone.js 的例子中有使用到 template, 及数据的填充,其实这已经很接近 Model 了。现在来学习怎么创建自己的 Model 类,并简单的使用。Backbone.js 中 Model 会涉及到很多的概念,如 Model 的初始化,默认值,属性的读写,属性值改变的监听,数据渲染,校验,以及与服务端的数据同步等。
本文不打算讲前面大部分的内容,最初思考的一个脉络是怎么把 Model 引入进来,所以线索会是建立 Model 类 -> 初始化 Model 实例 -> 设置值 -> 渲染到页面,其余 Model 特性分别再深入。
直观地能想到的 JavaScript 的 Model 是一个 JSON 对象,差不多,不过 Backbone 赋予 Model 默认属性,只能通过 getter/setter 方法来访问 Model 中的属性值,不能直接用点操作符,相当于 Backbone 的属性是私有的。 Read More
使用 Backbone 的 View 时,可以象传统 jQuery 那样定义事件,$("selector").click(function(){...})。幸运的是 Backbone 让我们在 View 中定义事件变得更为简单和集中,只要设置 View 的events属性,配置 事件,元素以及相应的处理方法,基本模式如下:格式是1events: { 2 "click button": "event_handler", 3 "focus #name": "event_handler" 4}, 5 6event_handler: function( event ) { 7 alert(event.target.id); 8}"事件 选择器": "事件处理函数名", 奇怪为什么这里不是使用事件处理函数名的引用,也就是不能写成下面两种方式: Read More
前面一篇 Backbone.js HelloWorld,应用起步 只是让 Backbone 跑起来,实际的应用中会使用到模板,Model 等,而模板又是进阶的基础。所以这里介绍在 View 中使用模板,以及如何向模板填充值,模板可以用字符串,或是用 <script type="text/template"> 声明的内容。使用 <%= %> 或 <%- %> 来声明变量输出的占位符。
Backbone 的模板要用到的是 underscore.js 库, 要深入了解 Unserscore 就看官方的 Underscore.js 的文档,Underscore 的 template 方法的原型如下:_.template(templateString, [data], [settings])
Read More